使用 ArcGIS Engine 開發自訂 GIS 應用程式時,建立右鍵選單有兩種主流方式:
ContextMenuStrip,實作簡單但擴展性受限本文詳細示範 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);
// 取得滑鼠點擊資訊
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);
}

SetHook 傳遞上下文,命令與 UI 解耦AddItem,無需修改選單邏輯此模式同樣適用於 MapControl、PageLayoutControl 等其他控制項的右鍵選單建立。