使用arcengine開發程序右鍵菜單

ArcGIS Engine是ESRI在ArcGIS9版本纔開始推出的新產品,它是一套完備的嵌入式GIS 組件庫和工具庫,使用ArcGIS Engine開發的GIS應用程序能夠脫離ArcGIS Desktop而運行。讓咱們一塊兒來看,右鍵菜單的設計與實現。ide

利用ArcGIS Engine開發自定義GIS應用程序中,通常有兩種方式來創建右鍵菜單。工具

一是利用開發工具自帶的右鍵菜單控件,如Visual Studio中的ContextMenuStrip控件;開發工具

二是利用ArcGIS Engine封裝好的IToolbarMenu接口。相比較而言,前者實現起來較簡單,但後者使程序具備更好的面向對象性,也更利於擴展,在大型系統中,使用該方法是較好的選擇。spa

本文詳細講述如何利用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();
如此便創建了新的菜單,但其中沒有實際的菜單項,具體的命令或者工具必須做爲菜單項添加到菜單中才能實現相應的功能。rest

在添加菜單項以前,得先實現相應命令或工具。下面自定義一個縮放至圖層的命令,添加一個類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); } }

相關文章
相關標籤/搜索