• 图层树右键菜单结合Command操作过程


         图层树右键菜单结合Command操作过程

      根据老师线上培训图层树右键菜单的生成,添加contextMenuStrip后再依次添加、命名ToolStripMenuItem,若将全部‘项’添加Click事件,假如图层树中 矢量和栅格的右键菜单都要添加数据,那么就要写2个添加数据的点击事件,那么可不可以就写一个添加数据的方法节省代码呢?中间如何联通呢?

      解决过程如下:

      1.窗体的toc控件添加‘MouseDown’ 事件,加入代码

     1     private void tocControlMain_MouseDown(object sender, MouseEventArgs e)  
    {
                 if (e.Button == MouseButtons.Right)//TOC图层树中右击事件
     2             {
     3                 PIE.AxControls.PIETOCNodeType type = new PIE.AxControls.PIETOCNodeType();//图层树控件节点类型
     4                 IMap map = null;
     5                 ILayer layer = null;
     6                 Object unk = null;
     7                 Object data = null;
     8                 tocControlMain.HitTest(e.X, e.Y, ref type, ref map, ref layer, ref unk, ref data);// 传递节点数据类型
     9                 PIE.AxControls.PIETOCNodeTag tag = new PIETOCNodeTag();
    10                 tag.Map = map;//节点所包含的参数类的参数
    11                 tag.Layer = layer;
    12                 tag.UNK = unk;
    13                 tag.Data = data;
    14                 mapControl1.CustomerProperty = tag;//参数传给属性信息
    15                 switch (type)
    16                 {
    17                     case PIETOCNodeType.FeatureLayer://矢量
    18                         IFeatureLayer featureLayer = layer as IFeatureLayer;
    19                         if (featureLayer == null)             return;                    
    this.contextMenuStrip_FeatureLayer.Show(tocControlMain, new System.Drawing.Point(e.X, e.Y)); //显示菜单 20 break; 21 22 case PIETOCNodeType.RasterLayer://栅格 23 IRasterLayer pRasterLayer = layer as IRasterLayer; 24 if (pRasterLayer == null) return;
    this.contextMenuStrip1_RasterLay.Show(tocControlMain, new System.Drawing.Point(e.X, e.Y)); //显示菜单 25 break; 26 27 case PIETOCNodeType.Map://地图
    this.contextMenuStrip_TocMenu.Show(tocControlMain, new System.Drawing.Point(e.X, e.Y));//显示菜单
    28 break;
    29 }
    30 }
    }

       2. 

    点该处然后在属性中的‘MouseUp’右侧添加‘tocMenuItem_MouUpClick’,双击进入编辑代码,下面代码可被图层树右键菜单项 共用,后面重写点击事件,在不同右键菜单实现相同功能可共用代码。

     1  private void tocMenuItem_MouUpClick(object sender, MouseEventArgs e)
     2         {
     3             if (e.Button == MouseButtons.Right)//选择鼠标左键为作用生效键
     4             {
     5                 return;
     6             }
     7             ToolStripMenuItem item = sender as ToolStripMenuItem;
     8             if (item == null)
     9             {
    10                 return;
    11             }
    12             ICommand command = item.Tag as ICommand;//本人认为 参数类强制转换为ICommand类
    13 if (command == null)
    14 {
    15 return;
    16 }
    17 command.OnCreate(mapControl1); //必须加
    18 command.OnClick();
    19 ITool tool = command as ITool;
    20 if (tool != null)
    21 {
    22 mapControl1.CurrentTool = tool;
    23 }
    24 }

       3.在初始化函数中设置TOC右键菜单,部分如下:

    1             

                private void InitFrm()//初始化窗体
                 { //toc图层编辑

      2             toolStripMenuItem_DeleteRLayer.Tag = new Command.DelLayerCommand();//删除所有图层

      3             toolStripMenuItem_TocAddData.Tag = new Command.AddDataCommand();

    4             ModifyStrToolStripMenuItem.Tag = new Command.SpatialReferenceSelectorCommand();

      4.在解决方案资源管理器如图添加文件夹和类:

      5.如下添加Command类:

    using PIE.AxControls;
    using PIE.Controls;
    using PIE.Carto;
    namespace PIEAppication.Command
    {
        class SpatialReferenceSelectorCommand: BaseCommand
        {
             #region 私有变量
            /// <summary>
            /// 地图实例
            /// </summary>
            private IMapControl m_MapControl;
            #endregion
    
            /// <summary>
            /// 构造函数
            /// </summary>
            public SpatialReferenceSelectorCommand()
            {
                base.Caption = "坐标系选择改变";
                base.ToolTip = "坐标系选择改变";
            }
            /// <summary>
            /// 重写单击按钮事件
            /// </summary>
            public override void OnClick()
            {
                //1.获取当前地图
                IMap map = m_HookHelper.FocusMap;
                //2.实例化空间参考窗口对象
                PIE.AxControls.SpatialReferenceSelectorDialog sRSelectorDialog = new SpatialReferenceSelectorDialog();
                sRSelectorDialog.SetMap(map);  //设置地图(地图对象)
                sRSelectorDialog.SpatialReference = map.SpatialReference;
                if (sRSelectorDialog.ShowDialog() != 1) return;//1表示确定、0表示取消
                map.SpatialReference = sRSelectorDialog.SpatialReference;
                (map as IActiveView).PartialRefresh(ViewDrawPhaseType.ViewAll);
            }
        }
    }
    

      6.当栅格和矢量对象都要设置选择坐标系时,可以都以相同的MouseUp事件、再初始化设置,就可以共用Command类。执行效果如下:

      7.此外发现其它菜单点击方法也可以使用以上,MouseUp事件、Command类进行实现,当软件多处使用相同功能时可简化代码。同理还实现了矢量数据属性表的显示,如下:

      一些软件的右键总是有些便捷的功能,大家可以试试右键菜单功能哦

      

     

  • 相关阅读:
    Android——4.2
    【图像分割】网络最大流
    【OpenCV】内存溢出
    【xml】利用OpenCV解析
    【文件】读取一个文件夹下所有的jpg图片
    【QT】ui转代码
    【CCL】连通区域提取
    【Qt】学习笔记(一)
    【数据结构】Huffman树
    【数据结构】中序遍历线索二叉树
  • 原文地址:https://www.cnblogs.com/paulhellolipu/p/11240462.html
Copyright © 2020-2023  润新知