TocControl控件中移动图层的实现

首先已经实如今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