最近在搞arcengine 二次開發,遇到了好多問題,也通過網上查資料試着慢慢解決了,把解決的步驟記錄下來,有需要幫助的可以看一下,也歡迎各位來批評指正。
想給自己的map application在圖層上添加右鍵菜單,谷歌了一下,找到了解決的方法,原文的位址edndoc.esri.com/arcobjects/9.2/NET/1ED14BF2-A0E3-4e56-A70D-B9A7F7EC7880.htm。然後我根據這個添加了自己的右鍵菜單,又有一些改動。
效果如圖所示(有點簡陋)
,僅僅是簡單的實作了一個删除目前圖層的功能
首先添加成員變量IToolBarMenu,然後建立一個RemoveLayer類,基類是BaseCommand,RemoveLayer的代碼如下所示
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ESRI.ArcGIS.ADF.BaseClasses;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Controls;
namespace InstanceCluter.ContextMenu
{
public sealed class RemoveLayer : BaseCommand
{
private IMapControl3 m_mapControl;
public RemoveLayer()
{
base.m_caption = "删除";
}
public override void OnClick()
{
//插入你自己的代碼
}
public override void OnCreate(object hook)
{
m_mapControl = (IMapControl3)hook;
}
}
}
你需要做的事在重寫OnClick函數,在裡面實作你自己想要實作的功能,然後将自己實作的功能添加到右鍵菜單上去,代碼如下
private void CreateContextMenu()
{
m_menuLayer = new ToolbarMenuClass();
m_menuLayer.AddItem(new RemoveLayer(), -1, 0, false, esriCommandStyles.esriCommandStyleTextOnly);
m_menuLayer.SetHook(m_mapControl);
}
關于ToolbarMenuClass的使用可以去查官方文檔,接着将這個函數添加到MainForm_Load函數中去,然後給axTOCControl控件添加滑鼠點選事件(OnMouseDown),添加代碼如下
private void axTOCControl1_OnMouseDown(object sender, ITOCControlEvents_OnMouseDownEvent e)
{
if (e.button != 2) return;
esriTOCControlItem item = esriTOCControlItem.esriTOCControlItemNone;
IBasicMap map = null; ILayer layer = null;
object other = null; object index = null;
//Determine what kind of item is selected
this.axTOCControl1.HitTest(e.x, e.y, ref item, ref map, ref layer, ref other, ref index);
//Ensure the item gets selected
if (item == esriTOCControlItem.esriTOCControlItemMap)
this.axTOCControl1.SelectItem(map, null);
//這裡就是我和官方執行個體代碼不同的地方
else if (item == esriTOCControlItem.esriTOCControlItemLayer)
this.axTOCControl1.SelectItem(layer, null);
//Set the layer into the CustomProperty (this is used by the custom layer commands)
m_mapControl.CustomProperty = layer;
//Popup the correct context menu
if (item == esriTOCControlItem.esriTOCControlItemMap)
{
//用過arcgis,都知道這個layers的意思
MessageBox.Show("點選了Layers");
}
if (item == esriTOCControlItem.esriTOCControlItemLayer)
{
m_menuLayer.PopupMenu(e.x, e.y, this.axTOCControl1.hWnd);
}
}
官方代碼和我的不同在于他直接用else,并沒有判斷item的類型,這樣的話,如果你在axTOCControl點選的話,也執行該語句this.axTOCControl1.SelectItem(layer, null);,這樣就會引發異常(A valid object is required for this property),在我添加了一個判斷語句之後就沒有問題了。
以上就是全部步驟啦。歡迎批評指正
轉載于:https://www.cnblogs.com/xiuchuan/p/6850423.html