文档章节

使用arcengine开发程序右键菜单

crossmix
 crossmix
发布于 2015/02/22 21:11
字数 757
阅读 835
收藏 1

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
粉丝 66
博文 305
码字总数 645711
作品 0
广州
高级程序员
ArcEngine 开始编辑按钮一直是灰的

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

枫之泪
06/20
0
0
基于ArcEngine的道路选线

基于ArcEngine10.0 开发道路选线的功能 道路选线指根据地形条件,首先确定坡度费用,然后基于最小费用算法来计算两个指定点间的道路线路走向。计算出道路走向后,就可分析道路的平均坡度、最...

房晓亮
06/30
0
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
0
ArcEngine9.3迁移至ArcObject10.1

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

gisweis
2015/04/27
0
0
Python开发环境Wing IDE使用教程:部分调试功能介绍

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

kouxunli1
2013/11/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

初级开发-编程题

` public static void main(String[] args) { System.out.println(changeStrToUpperCase("user_name_abc")); System.out.println(changeStrToLowerCase(changeStrToUpperCase("user_name_abc......

小池仔
今天
4
0
现场看路演了!

HiBlock
昨天
12
0
Rabbit MQ基本概念介绍

RabbitMQ介绍 • RabbitMQ是一个消息中间件,是一个很好用的消息队列框架。 • ConnectionFactory、Connection、Channel都是RabbitMQ对外提供的API中最基本的对象。Connection是RabbitMQ的s...

寰宇01
昨天
9
0
官方精简版Windows10:微软自己都看不过去了

微软宣布,该公司正在寻求解决方案,以减轻企业客户的Windows 10规模。该公司声称,企业客户下载整个Windows 10文件以更新设备既费钱又费时。 微软宣布,该公司正在寻求解决方案,以减轻企业...

linux-tao
昨天
14
0
TypeScript基础入门之JSX(二)

转发 TypeScript基础入门之JSX(二) 属性类型检查 键入检查属性的第一步是确定元素属性类型。 内在元素和基于价值的元素之间略有不同。 对于内部元素,它是JSX.IntrinsicElements上的属性类型...

durban
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部