利用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等添加各自的右鍵菜單。最終實現效果如下。
【編輯推薦】