实现TOCControl和MapControl中的右键菜单(本人菜鸟,注重基础,高手莫笑)
坛子里面已经有很多高手详细的介绍了这个东西,本文主要是借鉴前辈的只是和经验,总结自己的一点心得和想法……
先上代码:
既然是右键菜单肯定要跟鼠标打交道,所以不管是TOCControl还是MapControl,在实现右键菜单的时候,都要用到OnMouseDown这个事件。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 //实现控件的右键菜单项
2 private void axTOCControl1_OnMouseDown(object sender, ITOCControlEvents_OnMouseDownEvent e)
3 {
4 if (e.button != 2) return;
5 esriTOCControlItem pItem = esriTOCControlItem.esriTOCControlItemNone;
6 IBasicMap pMap = null;
7 ILayer pLayer = null;
8 object unk=null,data=null;
9 //内容表控件中的这个方法是根据鼠标的点击位置返回内容表中的项
10 axTOCControl1.HitTest(e.x,e.y,ref pItem,ref pMap,ref pLayer,ref unk,ref data);
11 //下面是判断鼠标选中的项是什么类型的项目(通过esriTOCControlItem的枚举值我们可以知道,针对不同的类型项可以添加不同的右键菜单(图层、Map对象、图例对象))
12 if (pItem == esriTOCControlItem.esriTOCControlItemLayer)
13 {
14 /*第一种方法:使用contextMenuStrip控件
15 //下面的这个point是获得鼠标的点击位置。
16 System.Drawing.Point point = new System.Drawing.Point();
17 //设置这个点的位置为鼠标的点击位置
18 point.X = e.x;
19 point.Y = e.y;
20 //显示右键菜单
21 contextMenuStrip1.Show(axTOCControl1, point);
22 show方法的两个参数:一个是右键菜单要关联的控件(或者是要显示右键菜单的控件)。另一个是:鼠标的点击位置
23 //该位置也是右键菜单四个角中,左上的这个位置*/
24
25
26
27 //第二种方法:使用ToolbarMenu
28 IToolbarMenu pToolbarMenu = new ToolbarMenuClass();//创建工具条菜单类实例,相当与创建了一个菜单
29 //给菜单添加项目
30 pToolbarMenu.AddItem(new ControlsMapViewMenuClass () ,-1,-1,false,esriCommandStyles.esriCommandStyleIconAndText);
31 //设置菜单所关联的控件
32 pToolbarMenu.SetHook(axTOCControl1);
33 //根据鼠标的点击位置,弹出菜单
34 pToolbarMenu.PopupMenu(e.x,e.y,axTOCControl1.hWnd);
35 }
36 }
上面的是内容表控件的右键菜单,那么MapControl的右键菜单的实现,在我看来要比内容表控件的右键菜单要简单点儿。
关键地图控件右键菜单的一个问题,已经有很多人反映了这个问题:
在axMapControl控件的属性中有"ContexMenuStrip"这一项,用来设置地图控件的右键菜单,但是几乎所有的人都反映,这个设置是没有效果的,不知是什么原因,希望哪一位大侠能解释一下。
好了,回到主题。
MapControl中的右键菜单也有两种方式:1、利用“ContexMenuStrip”控件来实现(注意:采用这个方法要记得获取鼠标的点击位置)2、利用ToolbarMenu来实现(与上面的内容类似,就不多说了)。
最后,就是关于在右键菜单中添加项目。在右键菜单中添加项目(Item)时,既可以添加库里面提供的现成的命令和工具也可以添加自定义的命令和工具。