ArcEngine開發(fā)中右鍵菜單的設(shè)計與實現(xiàn)是怎樣的,針對這個問題,這篇文章詳細介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
創(chuàng)新互聯(lián)建站是專業(yè)的膠州網(wǎng)站建設(shè)公司,膠州接單;提供成都網(wǎng)站設(shè)計、網(wǎng)站制作,網(wǎng)頁設(shè)計,網(wǎng)站設(shè)計,建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進行膠州網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團隊,希望更多企業(yè)前來合作!
利用ArcGIS Engine開發(fā)自定義GIS應(yīng)用程序中,一般有兩種方式來建立右鍵菜單。
一是利用開發(fā)工具自帶的右鍵菜單控件,如Visual Studio中的ContextMenuStrip控件;
二是利用ArcGIS Engine封裝好的IToolbarMenu接口。相比較而言,前者實現(xiàn)起來較簡單,但后者使程序具有更好的面向?qū)ο笮?,也更利于擴展,在大型系統(tǒng)中,使用該方法是較好的選擇。
詳細講述如何利用IToolbarMenu接口實現(xiàn)右鍵菜單功能。
設(shè)計程序主界面如下圖所示:
在FrmMain類中首先定義如下指針:
private ITOCControl2 pTocControl; private IMapControl3 pMapControl; private IToolbarMenu pToolMenuMap; private IToolbarMenu pToolMenuLayer;
在FrmMain窗體的加載事件中初始化這些指針:
// 取得 MapControl 和 PageLayoutControl 的引用 pTocControl = (ITOCControl2)axTOCControl1.Object; pMapControl = (IMapControl3)axMapControl1.Object; // 創(chuàng)建菜單 pToolMenuMap = new ToolbarMenuClass(); pToolMenuLayer = new ToolbarMenuClass();
如此便建立了新的菜單,但其中沒有實際的菜單項,具體的命令或者工具必須作為菜單項添加到菜單中才能實現(xiàn)相應(yīng)的功能。
在添加菜單項之前,得先實現(xiàn)相應(yīng)命令或工具。下面自定義一個縮放至圖層的命令,添加一個類ZoomToLayer.cs至該項目,繼承自ESRI.ArcGIS.ADF.BaseClasses.BaseCommand。BaseCommand是一個抽象類,它為開發(fā)人員建立自定義命令項提供了一種有效的途徑。重寫基類的OnCreate和OnClick方法,實現(xiàn)縮放圖層至完整的顯示于地圖控件中。完整代碼如下。
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 = "放大至該圖層"; } //重寫B(tài)aseCommand基類的虛擬方法OnClick() public override void OnClick() { ILayer pLayer = (ILayer)pMapControl.CustomProperty; pMapControl.Extent = pLayer.AreaOfInterest; } //重寫B(tài)aseCommand基類的抽象方法OnCreate(object hook) public override void OnCreate(object hook) { pMapControl = (IMapControl3)hook; } } }
除自定義實現(xiàn)命令或者工具之外, ArcGIS Engine內(nèi)置了許多可以直接調(diào)用的常用命令和工具,如ControlsAddDataCommandClass、ControlsClearSelectionCommandClass等,也可以直接調(diào)用AE內(nèi)置的菜單,如ControlsFeatureSelectionMenu。
建立好自定義命令或工具后,就可以向菜單中添加對應(yīng)的菜單項了。在FrmMain窗體的加載事件中添加菜單項。
pToolMenuLayer.AddItem(new ZoomToLayer(), -1, 0, true, esriCommandStyles.esriCommandStyleTextOnly);
設(shè)置菜單的hook
pToolMenuLayer.SetHook(pMapControl);
現(xiàn)在有了菜單,需要在TocControl中右鍵彈出,所以在其OnMouseDown/OnMouseUp事件中獲取鼠標點擊信息,然后彈出對應(yīng)菜單即可。
//獲取鼠標點擊信息 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); } //設(shè)置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等添加各自的右鍵菜單。最終實現(xiàn)效果如下。
關(guān)于ArcEngine開發(fā)中右鍵菜單的設(shè)計與實現(xiàn)是怎樣的問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識。