ArcEngine开发中右键菜单的设计与实现是怎样的,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
利用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); } }
用同样的方法可以为TocControl中的地图、图层、符号以及为MapControl等添加各自的右键菜单。最终实现效果如下。
关于ArcEngine开发中右键菜单的设计与实现是怎样的问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注亿速云行业资讯频道了解更多相关知识。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。