Arcengine 二次开发添加右键菜单

最近在搞arcengine 二次开发,遇到了好多问题,也通过网上查资料试着慢慢解决了,把解决的步骤记录下来,有需要帮助的可以看一下,也欢迎各位来批评指正。

想给自己的map application在图层上添加右键菜单,谷歌了一下,找到了解决的方法,原文的地址edndoc.esri.com/arcobjects/9.2/NET/1ED14BF2-A0E3-4e56-A70D-B9A7F7EC7880.htm。然后我根据这个添加了自己的右键菜单,又有一些改动。

效果如图所示(有点简陋),仅仅是简单的实现了一个删除当前图层的功能

首先添加成员变量IToolBarMenu,然后新建一个RemoveLayer类,基类是BaseCommand,RemoveLayer的代码如下所示

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using ESRI.ArcGIS.ADF.BaseClasses;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Controls;

namespace InstanceCluter.ContextMenu
{
    public sealed class RemoveLayer : BaseCommand
    {
        private IMapControl3 m_mapControl;

        public RemoveLayer()
        {
            base.m_caption = "删除";
        }
        public override void OnClick()
        {
            //插入你自己的代码
        }

        public override void OnCreate(object hook)
        {
            m_mapControl = (IMapControl3)hook;
        }

    }
}

你需要做的事在重写OnClick函数,在里面实现你自己想要实现的功能,然后将自己实现的功能添加到右键菜单上去,代码如下

private void CreateContextMenu()
        {
            m_menuLayer = new ToolbarMenuClass();
            m_menuLayer.AddItem(new RemoveLayer(), -1, 0, false,    esriCommandStyles.esriCommandStyleTextOnly);
            m_menuLayer.SetHook(m_mapControl);

        }

关于ToolbarMenuClass的使用可以去查官方文档,接着将这个函数添加到MainForm_Load函数中去,然后给axTOCControl控件添加鼠标点击事件(OnMouseDown),添加代码如下

private void axTOCControl1_OnMouseDown(object sender, ITOCControlEvents_OnMouseDownEvent e)
        {
            if (e.button != 2) return;
            esriTOCControlItem item = esriTOCControlItem.esriTOCControlItemNone;
            IBasicMap map = null; ILayer layer = null;
            object other = null; object index = null;
            //Determine what kind of item is selected
            this.axTOCControl1.HitTest(e.x, e.y, ref item, ref map, ref layer, ref other, ref index);
            //Ensure the item gets selected
            if (item == esriTOCControlItem.esriTOCControlItemMap)
                this.axTOCControl1.SelectItem(map, null);
            //这里就是我和官方实例代码不同的地方
            else if (item == esriTOCControlItem.esriTOCControlItemLayer)
                this.axTOCControl1.SelectItem(layer, null);

            //Set the layer into the CustomProperty (this is used by the custom layer commands)
            m_mapControl.CustomProperty = layer;
            //Popup the correct context menu
            if (item == esriTOCControlItem.esriTOCControlItemMap)
            {
                //用过arcgis,都知道这个layers的意思
                MessageBox.Show("点击了Layers");
            }
            if (item == esriTOCControlItem.esriTOCControlItemLayer)
            {
                m_menuLayer.PopupMenu(e.x, e.y, this.axTOCControl1.hWnd);
            } 

        }

官方代码和我的不同在于他直接用else,并没有判断item的类型,这样的话,如果你在axTOCControl点击的话,也执行该语句this.axTOCControl1.SelectItem(layer, null);,这样就会引发异常(A valid object is required for this property),在我添加了一个判断语句之后就没有问题了。

以上就是全部步骤啦。欢迎批评指正

时间: 2024-10-09 21:34:05

Arcengine 二次开发添加右键菜单的相关文章

dev gridcontrol添加右键菜单

概述:右键菜单肯定是GridView中经常要使用的一个功能.本文主要描述两个方面:如何在GridView中添加右键菜单,以及如何设置菜单是否可用(enable). 右键菜单肯定是gridview中经常要使用的一个功能.本文主要描述两个方面:如何在GridView中添加右键菜单,以及如何设置菜单是否可用(enable). 一.添加右键菜单 1.在VS工具箱中的“菜单和工具栏”找到ContextMenuStrip控件,双击添加. 2.点击ContextMenuStrip右上方的小三角形,打开编辑项,

在ListCtrl上添加右键菜单,并创建响应函数。

一:添加右键菜单(在选中的行上面添加右键响应菜单) 1.首先创建一个菜单资源,在该项目上右键,添加资源,菜单资源,新建一个菜单资源(不会显示顶级菜单,只显示次级菜单). 2.在自己新添加的类CMyListCtrl(该类继承自CListCtrl,并且该类类型的对象与ListCtrl资源进行了绑定),并在该类的消息中添加=NM_RCLICK消息,在它的消息处理函数中, 添加右键弹出菜单代码: CMenu menu; menu.LoadMenuW(IDR_MENU1); //加载菜单资源 CMenu*

DevExpress TreeList添加右键菜单问题

添加右键流程: 1.先在窗体上拖两个控件,分别是popupMenu和barManager 2.barManager中绑定form属性为当前窗体名称 3.点击barManager右键选择customize,可直接添加子菜单,如果需要有工具栏.菜单栏.状态栏.怎选择Designer,可添加,然后在选择customize,添加command命令,再command选中菜单中执行命令 4.绑定右键菜单事件:在MouseDown事件中处理事件 --------------------------------

添加右键菜单

有时我们安装绿色版的软件常常是没有右键菜单的,但是对于一些常用的软件,我们需要添加右键菜单,添加方法,打开记事本,复制以下内容,按照自己的需要修改下所在软件的路径将txt另存为bat格式,双击即可: Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\*\shell\PotPlayer] @="Open with PotPlayer" "Icon"="E:\\Program Files (x86)

添加右键菜单命令 在此处打开命令窗口(W)(带图标)

@color 0A @title 添加右键菜单命令 在此处打开命令窗口(W)(带图标) by wjshan0808 @echo off reg add HKCR\Directory\Background\shell\在此处打开命令窗口(W) /v Icon /t reg_expand_sz /d %ComSpec% /f reg add HKCR\Directory\Background\shell\在此处打开命令窗口(W)\command /ve /t reg_sz /d "%ComSpec%

仅在TabControl中的Tab中添加右键菜单

若想实现仅在TabControl中的Tab中添加右键菜单,可在XAML中通过使用样式得到: <TabControl> <TabControl.ItemContainerStyle> <Style TargetType="{x:Type TabItem}"> <Setter Property="ContextMenu"> <Setter.Value> <ContextMenu/> <!--

给jquery easy-ui 添加右键菜单

版权声明:转自为EasyUI 的Tab 标签添加右键菜单 1 <!doctype html> 2 <html> 3 <head> 4 <meta http-equiv="content-type" content="text/html; charset=UTF-8"> 5 <title>tabs 右键菜单demo QQ:15129679</title> 6 <link rel="

[WinForm]TreeView 添加右键菜单

关机代码: #region 添加右键菜单 /// <summary> /// 添加右键菜单 /// <para>eg: treeF18.AttachMenu(contextMenuTree, n => n != null);</para> /// </summary> /// <param name="treeView">TreeView</param> /// <param name="co

CEdit添加右键菜单, ClistCtrl接收文件拖拽

CEdit接收文件拖拽很容易,但ClistCtrl却很难: CListCtrl添加右键菜单很容易,而CEdit却很难. 这种功能不全面,阴差阳错的感觉让人很头疼. 下面介绍一下 CEdit添加右键菜单 和 CListCtrl接收文件拖拽的方法 1. CEdit 添加右键菜单 从CEdit派生出一个类CMyEdit,添加消息ON_WM_CONTEXTMENU(),响应消息函数OnContextMenu().如下: 类定义: //自定义CMyEdit //目的为了实现CEdit添加右键菜单 clas