首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

ArcEngine 開發實戰:基於 IToolbarMenu 介面的右鍵選單設計與實作

     編輯:關於C語言

使用 ArcGIS Engine 開發自訂 GIS 應用程式時,建立右鍵選單有兩種主流方式:

  1. 原生控制項:如 WinForms ContextMenuStrip,實作簡單但擴展性受限
  2. IToolbarMenu 介面:ArcGIS 封裝的選單元件,具備優異的物件導向設計與擴展性,適合大型系統

本文詳細示範 IToolbarMenu 實作右鍵選單的完整流程。

主介面設計

程式主介面

核心欄位宣告

private ITOCControl2 pTocControl;
private IMapControl3 pMapControl;
private IToolbarMenu pToolMenuMap;
private IToolbarMenu pToolMenuLayer;

表單載入初始化

// 取得控制項參考
pTocControl = (ITOCControl2)axTOCControl1.Object;
pMapControl = (IMapControl3)axMapControl1.Object;

// 建立選單實例
pToolMenuMap = new ToolbarMenuClass();
pToolMenuLayer = new ToolbarMenuClass();

自訂命令實作:縮放至圖層

繼承 ESRI.ArcGIS.ADF.BaseClasses.BaseCommand,重寫 OnCreate 與 OnClick:

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 = "放大至該圖層";
        }

        public override void OnClick()
        {
            ILayer pLayer = (ILayer)pMapControl.CustomProperty;
            pMapControl.Extent = pLayer.AreaOfInterest;
        }

        public override void OnCreate(object hook)
        {
            pMapControl = (IMapControl3)hook;
        }
    }
}

內建命令與選單

ArcGIS Engine 內建大量可直接使用的命令:

  • ControlsAddDataCommandClass:加入資料
  • ControlsClearSelectionCommandClass:清除選取
  • ControlsFeatureSelectionMenu:要素選取選單

加入選單項目

// 加入自訂命令
pToolMenuLayer.AddItem(new ZoomToLayer(), -1, 0, true, esriCommandStyles.esriCommandStyleTextOnly);

// 設定 Hook(關鍵步驟,傳遞 MapControl 給命令)
pToolMenuLayer.SetHook(pMapControl);

TOC 控制項滑鼠事件處理

// 取得滑鼠點擊資訊
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 供自訂命令使用
    pMapControl.CustomProperty = pLayer;

    // 彈出對應選單
    if (pTocItem == esriTOCControlItem.esriTOCControlItemMap)
        pToolMenuMap.PopupMenu(e.x, e.y, pTocControl.hWnd);
    else
        pToolMenuLayer.PopupMenu(e.x, e.y, pTocControl.hWnd);
}

執行成果

右鍵選單執行效果

架構優勢總結

  • 命令封裝:每個功能獨立為 Command 類別,符合單一職責原則
  • Hook 機制:透過 SetHook 傳遞上下文,命令與 UI 解耦
  • 擴展性:新增功能只需新增 Command 類別並 AddItem,無需修改選單邏輯
  • 復用性:同一 Command 可同時用於工具列、選單、快捷鍵

此模式同樣適用於 MapControl、PageLayoutControl 等其他控制項的右鍵選單建立。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved