文档章节

使用arcengine开发程序右键菜单

crossmix
 crossmix
发布于 2015/02/22 21:11
字数 757
阅读 819
收藏 1
点赞 0
评论 0

ArcGIS Engine是ESRI在ArcGIS9版本才开始推出的新产品,它是一套完备的嵌入式GIS 组件库和工具库,使用ArcGIS Engine开发的GIS应用程序可以脱离ArcGIS Desktop而运行。让我们一起来看,右键菜单的设计与实现。

利用ArcGIS Engine开发自定义GIS应用程序中,一般有两种方式来建立右键菜单。

一是利用开发工具自带的右键菜单控件,如Visual Studio中的ContextMenuStrip控件;

二是利用ArcGIS Engine封装好的IToolbarMenu接口。相比较而言,前者实现起来较简单,但后者使程序具有更好的面向对象性,也更利于扩展,在大型系统中,使用该方法是较好的选择。

本文详细讲述如何利用IToolbarMenu接口实现右键菜单功能。 在FrmMain类中首先定义如下指针:

private ITOCControl2 pTocControl; private IMapControl3 pMapControl; private IToolbarMenu pToolMenuMap; private IToolbarMenu pToolMenuLayer;
在FrmMain窗体的加载事件中初始化这些指针:

// 取得 MapControl 和 PageLayoutControl 的引用 pTocControl = (ITOCControl2)axTOCControl1.Object; pMapControl = (IMapControl3)axMapControl1.Object; // 创建菜单 pToolMenuMap = new ToolbarMenuClass(); pToolMenuLayer = new ToolbarMenuClass();
如此便建立了新的菜单,但其中没有实际的菜单项,具体的命令或者工具必须作为菜单项添加到菜单中才能实现相应的功能。

在添加菜单项之前,得先实现相应命令或工具。下面自定义一个缩放至图层的命令,添加一个类ZoomToLayer.cs至该项目,继承自ESRI.ArcGIS.ADF.BaseClasses.BaseCommand。BaseCommand是一个抽象类,它为开发人员建立自定义命令项提供了一种有效的途径。重写基类的OnCreate和OnClick方法,实现缩放图层至完整的显示于地图控件中。完整代码如下。

using System; using System.Collections.Generic; using System.Text; using ESRI.ArcGIS.ADF.BaseClasses; using ESRI.ArcGIS.Carto; using ESRI.ArcGIS.Controls; namespace ArcEngine3_3 { class ZoomToLayer : BaseCommand { //定义指针 private IMapControl3 pMapControl; public ZoomToLayer() { base.m_caption = "放大至该图层"; } //重写BaseCommand基类的虚拟方法OnClick() public override void OnClick() { ILayer pLayer = (ILayer)pMapControl.CustomProperty; pMapControl.Extent = pLayer.AreaOfInterest; } //重写BaseCommand基类的抽象方法OnCreate(object hook) public override void OnCreate(object hook) { pMapControl = (IMapControl3)hook; } } }
除自定义实现命令或者工具之外, ArcGIS Engine内置了许多可以直接调用的常用命令和工具,如ControlsAddDataCommandClass、ControlsClearSelectionCommandClass等,也可以直接调用AE内置的菜单,如ControlsFeatureSelectionMenu。

建立好自定义命令或工具后,就可以向菜单中添加对应的菜单项了。在FrmMain窗体的加载事件中添加菜单项。

pToolMenuLayer.AddItem(new ZoomToLayer(), -1, 0, true, esriCommandStyles.esriCommandStyleTextOnly);
设置菜单的hook

pToolMenuLayer.SetHook(pMapControl);
现在有了菜单,需要在TocControl中右键弹出,所以在其OnMouseDown/OnMouseUp事件中获取鼠标点击信息,然后弹出对应菜单即可。

//获取鼠标点击信息 axTOCControl1.HitTest(e.x, e.y, ref pTocItem, ref pBasicMap, ref pLayer, ref oLegendGroup, ref oIndex); if (e.button == 2) { if (pTocItem == esriTOCControlItem.esriTOCControlItemMap) { pTocControl.SelectItem(pBasicMap, null); } else { pTocControl.SelectItem(pLayer, null); } //设置CustomProperty为layer (用于自定义的Layer命令) pMapControl.CustomProperty = pLayer; //弹出右键菜单 if (pTocItem == esriTOCControlItem.esriTOCControlItemMap) { pToolMenuMap.PopupMenu(e.x, e.y, pTocControl.hWnd); } else { pToolMenuLayer.PopupMenu(e.x, e.y, pTocControl.hWnd); } }

© 著作权归作者所有

共有 人打赏支持
crossmix
粉丝 64
博文 302
码字总数 645711
作品 0
广州
高级程序员
ArcEngine 开始编辑按钮一直是灰的

用ArcEngine控件自己写了个程序,其他图层都能添加, 就是开始编辑菜单一直是灰的,我的license已经绑定了, 图层也添加了,伙伴控件也绑定了,找了半天没找到原因,看了官方给的例子程序是个...

枫之泪 ⋅ 06/20 ⋅ 0

基于ArcEngine+C#实现的JLKDataManager空间数据平台架构设计

空间数据管理平台总体设计 随需而变 柔性再造 成都领君科技有限公司 http://www.linjon.cn 2012年11月 目录 1. 引言... 1 1.1. 编写目的... 1 1.2. 背景... 1 1.3. 定义... 1 2. 总体设计......

成都领君科技 ⋅ 2013/02/26 ⋅ 0

ArcEngine9.3迁移至ArcObject10.1

以前写的程序,现在看起来真是相当的青涩,当时写的东西是显得多么地无知啊,很多应该写成一个类,有些需要优化,需要多线程,代码需要加密……总一种想修改的冲动。但这也需要时间和精力。下...

gisweis ⋅ 2015/04/27 ⋅ 0

运用ArcGIS Server开发WebGIS系统主要几种途径及发展趋势

使用ArcGIS Server开发WebGIS一般可以有以下几种途径 1、使用ESRI ADF for java或for .Net ADF是ESRI开发的一套用于WebGIS开发的框架,功能非常强大。偶使用过for Java的版本。他使用JSF构建...

sinat_34719507 ⋅ 2017/03/06 ⋅ 0

Python开发环境Wing IDE使用教程:部分调试功能介绍

下面是用户应该了解的Wing IDE的其它一些调试功能: Main Debug File—用户可以指定项目中的一个文件作为调试的主入口点。当完成这个设置之后,调试总是从这个文件开始,除非用户使用Debug菜单...

kouxunli1 ⋅ 2013/11/11 ⋅ 0

Python开发环境Wing IDE部分调试功能简介

下面是用户应该了解的一些功能: Main Debug File—用户可以指定项目中的一个文件作为调试的主入口点。当完成这个设置之后,调试总是从这个文件开始,除非用户使用Debug菜单中的Debug Current...

缘分已尽奈何缘浅 ⋅ 2013/11/11 ⋅ 0

使用python及百度API对百度poi数据进行爬取(二)

开始按计划实现流程。 一 区域分割。 这个步骤是整个方案比较关键的一步,区域分割的要求如下。不能太大,因为一个区域一个类别的POI数目不能超过400;覆盖要完全,要包括全市的市域;不能有...

u010723516 ⋅ 2017/06/08 ⋅ 0

基于DotNet构件技术的企业级敏捷软件开发平台 - AgileEAS.NET平台开发指南 - 报表系统集成说明

概述 AgileEAS.NET平台提供了自己的报表设计器,并且把报表和平台集成在一起,开发人员可以使用独立的报表设计器设计好报表之后导入到AgileEAS.NET平台中,也可以AgileEAS.NET平台的报表管理...

agilelab ⋅ 2010/09/10 ⋅ 0

分享一下我在Windows平台下的一些使用习惯

回想这十几年使用PC的经历当中,大部分时间都是在和Windows平台打交道,在十几年的使用当中,也逐渐形成了一些自己的使用习惯和经验,拿出来分享一下吧,也许大家也有各自的习惯与经验也不妨...

since1986 ⋅ 2017/10/27 ⋅ 0

C#实例:5个.net经典例子(窗体与界面设计)

C#实例:5个.net经典例子(窗体与界面设计) 实例001 带历史信息的菜单 实例说明 在开发图纸管理软件时,要求在菜单上记录用户最近打开的档案或图纸,以方便下次使用。如图1.1所示,单击“文...

庸人谷 ⋅ 2012/11/12 ⋅ 2

没有更多内容

加载失败,请刷新页面

加载更多

下一页

容器之重命名镜像

使用docker tag命令来重命名镜像名称,先执行help,查看如何使用如下 mjduan@mjduandeMacBook-Pro:~/Docker % docker tag --helpUsage:docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TA...

汉斯-冯-拉特 ⋅ 25分钟前 ⋅ 0

with 的高级用法

那么 上下文管理器 又是什么呢? 上下文管理器协议包含 __enter__ 和 __exit__ 两个方法。with 语句开始运行时,会在上下文管理器对象上调用 __enter__ 方法。with 语句运行结束后,会在上下...

阿豪boy ⋅ 45分钟前 ⋅ 0

使用 jsoup 模拟登录 urp 教务系统

需要的 jsoup 相关 jar包:https://www.lanzous.com/i1abckj 1、首先打开教务系统的登录页面,F12 开启浏览器调试,注意一下 Request Headers 一栏的 Cookie 选项,我们一会需要拿这个 Cook...

大灰狼时间 ⋅ 45分钟前 ⋅ 0

关于线程的创建

转自自己的笔记: http://note.youdao.com/noteshare?id=87584d4874acdeaf4aa027bdc9cb7324&sub=B49E8956E145476191C3FD1E4AB40DFA 1.创建线程的方法 Java使用Thread类代表线程,所有的线程对......

MarinJ_Shao ⋅ 56分钟前 ⋅ 0

工厂模式学习

1. 参考资料 工厂模式-伯乐在线 三种工厂-思否 深入理解工厂模式 2. 知识点理解 2.1 java三种工厂 简单工厂 工厂模式 抽象工厂 2.2 异同点 逐级复杂 简单工厂通过构造时传入的标识来生产产品...

liuyan_lc ⋅ 今天 ⋅ 0

Java NIO

1.目录 Java IO的历史 Java NIO之Channel Java NIO之Buffer Java NIO之Selector Java NIO之文件处理 Java NIO之Charset Java 可扩展IO 2.简介 “IO的历史”讲述了Java IO API从开始到现在的发...

士别三日 ⋅ 今天 ⋅ 0

[Err] ORA-24344: success with compilation error

从txt文本复制出创建function的脚本,直接执行,然后报错:[Err] ORA-24344: success with compilation error。 突然发现脚本的关键字,居然不是高亮显示。 然后我把脚本前面的空格去掉,执行...

wenzhizhon ⋅ 今天 ⋅ 0

Spring Security授权过程

前言 本文是接上一章Spring Security认证过程进一步分析Spring Security用户名密码登录授权是如何实现得; 类图 调试过程 使用debug方式启动https://github.com/longfeizheng/logback该项目,...

hutaishi ⋅ 今天 ⋅ 0

HAProxy基于KeepAlived实现Web高可用及动静分离

前言 软件负载均衡一般通过两种方式来实现: 基于操作系统的软负载实现 基于第三方应用的软负载实现 LVS是基于Linux操作系统实现的一种软负载,而HAProxy则是基于第三方应用实现的软负载。 ...

寰宇01 ⋅ 今天 ⋅ 0

微软自研处理器的小动作:已经开始移植其他平台的工具链

微软将 Windows 10 、Linux 以及工具链如 C/C++ 和 .NET Core 运行时库、Visual C++ 2017 命令行工具、RyuJIT 编辑器等移植到其自主研发的处理器架构 E2。微软还移植了广泛使用的 LLVM C/C++...

linux-tao ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部