ArcEngine开发:右键菜单的设计与实现

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

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

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

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

本文详细讲述如何利用IToolbarMenu接口实现右键菜单功能。

设计程序主界面如下图所示:

在FrmMain类中首先定义如下指针:

 

  1. private ITOCControl2 pTocControl;   
  2. private IMapControl3 pMapControl;   
  3. private IToolbarMenu pToolMenuMap;   
  4. private IToolbarMenu pToolMenuLayer;  

 

在FrmMain窗体的加载事件中初始化这些指针:

 

  1. // 取得 MapControl 和 PageLayoutControl 的引用   
  2. pTocControl = (ITOCControl2)axTOCControl1.Object;   
  3. pMapControl = (IMapControl3)axMapControl1.Object;   
  4. // 创建菜单   
  5. pToolMenuMap = new ToolbarMenuClass();   
  6. pToolMenuLayer = new ToolbarMenuClass();  

 

如此便建立了新的菜单,但其中没有实际的菜单项,具体的命令或者工具必须作为菜单项添加到菜单中才能实现相应的功能。

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

 

  1. using System;   
  2. using System.Collections.Generic;   
  3. using System.Text;   
  4. using ESRI.ArcGIS.ADF.BaseClasses;   
  5. using ESRI.ArcGIS.Carto;   
  6. using ESRI.ArcGIS.Controls;   
  7. namespace ArcEngine3_3   
  8. {   
  9. class ZoomToLayer : BaseCommand   
  10. {   
  11. //定义指针   
  12. private IMapControl3 pMapControl;   
  13. public ZoomToLayer()   
  14. {   
  15. base.m_caption = "放大至该图层";   
  16. }   
  17. //重写BaseCommand基类的虚拟方法OnClick()   
  18. public override void OnClick()   
  19. {   
  20. ILayer pLayer = (ILayer)pMapControl.CustomProperty;   
  21. pMapControl.Extent = pLayer.AreaOfInterest;   
  22. }   
  23. //重写BaseCommand基类的抽象方法OnCreate(object hook)   
  24. public override void OnCreate(object hook)   
  25. {   
  26. pMapControl = (IMapControl3)hook;   
  27. }   
  28. }   
  29. }  

 

除自定义实现命令或者工具之外, ArcGIS Engine内置了许多可以直接调用的常用命令和工具,如ControlsAddDataCommandClass、ControlsClearSelectionCommandClass等,也可以直接调用AE内置的菜单,如ControlsFeatureSelectionMenu。

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

 

  1. pToolMenuLayer.AddItem(new ZoomToLayer(), -1, 0, true, esriCommandStyles.esriCommandStyleTextOnly);  

 

设置菜单的hook

 

  1. pToolMenuLayer.SetHook(pMapControl);  

 

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

 

  1. //获取鼠标点击信息   
  2. axTOCControl1.HitTest(e.x, e.y, ref pTocItem, ref pBasicMap, ref pLayer, ref oLegendGroup, ref oIndex);   
  3. if (e.button == 2)   
  4. {   
  5. if (pTocItem == esriTOCControlItem.esriTOCControlItemMap)   
  6. {   
  7. pTocControl.SelectItem(pBasicMap, null);   
  8. }   
  9. else   
  10. {   
  11. pTocControl.SelectItem(pLayer, null);   
  12. }   
  13. //设置CustomProperty为layer (用于自定义的Layer命令)   
  14. pMapControl.CustomProperty = pLayer;   
  15. //弹出右键菜单   
  16. if (pTocItem == esriTOCControlItem.esriTOCControlItemMap)   
  17. {   
  18. pToolMenuMap.PopupMenu(e.x, e.y, pTocControl.hWnd);   
  19. }   
  20. else   
  21. {   
  22. pToolMenuLayer.PopupMenu(e.x, e.y, pTocControl.hWnd);   
  23. }   
  24. }  

 

用同样的方法可以为TocControl中的地图、图层、符号以及为MapControl等添加各自的右键菜单。最终实现效果如下。

【编辑推荐】

  1. Konqueror右键菜单的扩展
  2. 技术分享 添加FLex右键菜单的方法
  3. 如何在C#添加鼠标右键菜单
  4. ASP.NET MVC 2中实现右键菜单和简单分页

 

责任编辑:于铁 来源: 博客园
相关推荐

2021-11-01 05:39:18

Windows 11操作系统微软

2009-12-24 10:04:31

WPF右键菜单

2022-05-18 07:44:13

自定义菜单前端

2011-02-23 09:29:29

Konqueror

2011-09-06 10:00:19

Vista右键菜单

2021-07-21 05:31:39

Windows 11操作系统微软

2021-11-15 22:43:40

Windows 11操作系统微软

2010-07-29 13:27:13

Flex右键菜单

2010-07-29 13:18:45

Flex右键菜单

2011-07-25 14:49:36

jQuery

2021-07-26 18:20:04

微软Windows 11Windows

2010-08-02 09:18:39

ASP.NET MVC

2021-12-08 09:46:05

IDEAORM代码

2009-08-18 11:17:37

C#添加鼠标右键

2021-01-05 09:38:28

开发Node代码

2021-01-21 12:04:05

Windows 10UI界面微软

2009-08-18 09:03:19

Windows 7磁盘碎片整理

2021-07-20 15:40:21

Windows 11Windows微软

2021-02-04 06:55:40

微软Edge浏览器

2017-01-16 16:20:31

Windows 10右键菜单操作方法
点赞
收藏

51CTO技术栈公众号