zoukankan      html  css  js  c++  java
  • ArcEngine开发——右键菜单的设计与实现

    ArcEngine开发——右键菜单的设计与实现

    利用ArcGIS Engine开发自定义GIS应用程序中,一般有两种方式来建立右键菜单。一是利用开发工具自带的右键菜单控件,如Visual Studio中的ContextMenuStrip控件;二是利用ArcGIS Engine封装好的IToolbarMenu接口。相比较而言,前者实现起来较简单,但后者使程序具有更好的面向对象性,也更利于扩展,在大型系统中,使用该方法是较好的选择。本文详细讲述如何利用IToolbarMenu接口实现右键菜单功能。

    设计程序主界面如下图所示。基本浏览功能以及获取TocControl控件中的图层信息详见ArcEngine开发——地图浏览ArcEngine开发——从TocControl上获取鼠标点击位置的信息两篇文章。


    在FrmMain类中首先定义如下指针:

    private ITOCControl2 pTocControl;

    private IMapControl3 pMapControl;

    private IToolbarMenu pToolMenuMap;

    private IToolbarMenu pToolMenuLayer;

    在FrmMain窗体的加载事件中初始化这些指针:

    // 取得 MapControl 和 PageLayoutControl 的引用

    pTocControl = (ITOCControl2)axTOCControl1.Object;

    pMapControl = (IMapControl3)axMapControl1.Object;

    // 创建菜单

    pToolMenuMap = new ToolbarMenuClass();

    pToolMenuLayer = new ToolbarMenuClass();

    如此便建立了新的菜单,但其中没有实际的菜单项,具体的命令或者工具必须作为菜单项添加到菜单中才能实现相应的功能。

    在添加菜单项之前,得先实现相应命令或工具。下面自定义一个缩放至图层的命令,添加一个类ZoomToLayer.cs至该项目,继承自ESRI.ArcGIS.ADF.BaseClasses.BaseCommand。BaseCommand是一个抽象类,它为开发人员建立自定义命令项提供了一种有效的途径。重写基类的OnCreate和OnClick方法,实现缩放图层至完整的显示于地图控件中。完整代码如下。

    using System;

    using System.Collections.Generic;

    using System.Text;

    using ESRI.ArcGIS.ADF.BaseClasses;

    using ESRI.ArcGIS.Carto;

    using ESRI.ArcGIS.Controls;

    namespace ArcEngine3_3

    {

    class ZoomToLayer : BaseCommand

    {

    //定义指针

    private IMapControl3 pMapControl;

    public ZoomToLayer()

    {

    base.m_caption = "放大至该图层";

    }

    //重写BaseCommand基类的虚拟方法OnClick()

    public override void OnClick()

    {

    ILayer pLayer = (ILayer)pMapControl.CustomProperty;

    pMapControl.Extent = pLayer.AreaOfInterest;

    }

    //重写BaseCommand基类的抽象方法OnCreate(object hook)

    public override void OnCreate(object hook)

    {

    pMapControl = (IMapControl3)hook;

    }

    }

    }

    除自定义实现命令或者工具之外, ArcGIS Engine内置了许多可以直接调用的常用命令和工具,如ControlsAddDataCommandClass、ControlsClearSelectionCommandClass等,也可以直接调用AE内置的菜单,如ControlsFeatureSelectionMenu。

    建立好自定义命令或工具后,就可以向菜单中添加对应的菜单项了。在FrmMain窗体的加载事件中添加菜单项。

    pToolMenuLayer.AddItem(new ZoomToLayer(), -1, 0, true, esriCommandStyles.esriCommandStyleTextOnly);

    设置菜单的hook

    pToolMenuLayer.SetHook(pMapControl);

    现在有了菜单,需要在TocControl中右键弹出,所以在其OnMouseDown/OnMouseUp事件中获取鼠标点击信息,然后弹出对应菜单即可。

    //获取鼠标点击信息

    axTOCControl1.HitTest(e.x, e.y, ref pTocItem, ref pBasicMap, ref pLayer, ref oLegendGroup, ref oIndex);

    if (e.button == 2)

    {

    if (pTocItem == esriTOCControlItem.esriTOCControlItemMap)

    {

    pTocControl.SelectItem(pBasicMap, null);

    }

    else

    {

    pTocControl.SelectItem(pLayer, null);

    }

    //设置CustomProperty为layer (用于自定义的Layer命令)

    pMapControl.CustomProperty = pLayer;

    //弹出右键菜单

    if (pTocItem == esriTOCControlItem.esriTOCControlItemMap)

    {

    pToolMenuMap.PopupMenu(e.x, e.y, pTocControl.hWnd);

    }

    else

    {

    pToolMenuLayer.PopupMenu(e.x, e.y, pTocControl.hWnd);

    }

    }

    用同样的方法可以为TocControl中的地图、图层、符号以及为MapControl等添加各自的右键菜单。最终实现效果如下。

  • 相关阅读:
    常用Docker命令
    Ubuntu16.04安裝最新Nvidia驱动
    (转)5分钟让你明白“软链接”和“硬链接”的区别
    Centos7 Zabbix3.2集群安装
    Kettle定时抽取两个库中的两个表到目标库SYS_OPLOG表
    Elasticsearch Java API—多条件查询(must)
    logstash采集tomcat日志、mysql错误日志
    让Logstash每次都从头读文件及常见问题
    logstash之multiline插件,匹配多行日志
    spring security积累
  • 原文地址:https://www.cnblogs.com/hans_gis/p/2023366.html
Copyright © 2011-2022 走看看