首先已经实如今toc中的单击后判断左右单击,若是是左键则执行一系列操做。
全局变量:web
private ILayer pMoveLayer; //须要移动以调整显示顺序的图层 private int toIndex; //存放拖动图层移动到的图层索引号 private ESRI .ArcGIS .Geometry . Point pMoveLayerPoint; //鼠标按下时点的位置,用于判断是单击仍是移动,直接用point的话,会出现引用不明确的错误
鼠标按下执行hittest()判断单击的位置与单击的是什么,而后判断左键:svg
private void axTOCControl1_OnMouseDown(object sender, ITOCControlEvents_OnMouseDownEvent e) //在toc控件中左右单击时执行的菜单按钮 { IBasicMap bmap = new MapClass();//定义hittest方法的参数 ILayer player = new FeatureLayerClass(); object other = new object(); object index = new object(); esriTOCControlItem pitem = new esriTOCControlItem(); axTOCControl1.HitTest(e.x, e.y, ref pitem, ref bmap, ref player, ref other, ref index);//判断单击的是个啥子东西 if(e.button ==1) { pMoveLayerPoint.PutCoords(e.x,e.y ); //记录单击的位置坐标 if (pitem == esriTOCControlItem.esriTOCControlItemLayer) { if (player is IAnnotationSublayer) return; else pMoveLayer = player; //player就是单击的图层,将其赋给pmovelayer } } }
鼠标按下的执行完毕,接下来须要执行鼠标抬起时的事件,用hittest()判断弹起的地方位置坐标与此处是什么东西:spa
private void axTOCControl1_OnMouseUp(object sender, ITOCControlEvents_OnMouseUpEvent e) { try { if (e.button == 1 && pMoveLayer != null && pMoveLayerPoint.Y != e.y)//左键与要移动的图层不为空与鼠标按下时的坐标y值与鼠标弹起时的坐标y值不一样 { IBasicMap bmap = new MapClass();//定义hittest方法的参数 ILayer player = new FeatureLayerClass(); object other = new object(); object index = new object(); esriTOCControlItem pitem = new esriTOCControlItem(); axTOCControl1.HitTest(e.x, e.y, ref pitem, ref bmap, ref player, ref other, ref index);//判断单击的是个啥子东西 IMap pMap = axMapControl1.ActiveView.FocusMap; if (pitem == esriTOCControlItem.esriTOCControlItemLayer || player != null) //弹起的地方有图层 { if (pMoveLayer != player)//鼠标按下时的图层与弹起时的图层不同 { ILayer pTempLayer; //得到鼠标弹起时所在图层的索引 for (int i = 0; i < pMap.LayerCount; i++) { pTempLayer = pMap.get_Layer(i); if (pTempLayer == player) toIndex = i; } } } else if (pitem == esriTOCControlItem.esriTOCControlItemMap)//移动到最前面,鼠标甚至拖到了map上 toIndex = 0; else if (pitem == esriTOCControlItem.esriTOCControlItemNone)//拖到了最后没有图层的地方了 toIndex = pMap.LayerCount - 1; pMap.MoveLayer(pMoveLayer, toIndex);//开始移动 axMapControl1.ActiveView.Refresh(); axTOCControl1.Update(); } } catch (Exception ex) { MessageBox.Show(ex.Message); } }
代码来源:arcgis engine 地理信息系统开发教程 牟乃夏等主编。code