转自原文 ArcEngine开发之Command控件使用篇

在ArcEngine类库中有大量的Command控件用来与地图控件进行操作和交互。比如有一系列的地图浏览控件、地图查询控件、图斑选取控件、编辑控件来与MapControl和PageLayoutControl进行交互。这些控件被包含在ESRI.ArcGIS.Controls.dll类库中,位于ESRI.ArcGIS.Controls命名空间下。
这些内置的Command控件可以单独实例化来使用,也可以被安置在一个AxToolbarControl工具栏控件中,继而被存放在一个CommandPool池中以备调用。下面对这两种方式分别加以说明:

第一种使用方式是实例化一个Command对象并显式地运行它:

ICommand command = new ControlsOpenDocCommandClass();
command.OnCreate(m_mapControl.Object);
command.OnClick();
其中ControlsOpenDocCommandClass就是一个Command控件,通过调用它的OnCreate方法传递给它需要交互的MapControl,然后调用它的OnClick方法就可以运行。上面的例子会激活一个打开地图文档的对话框。

另一种方法是更加常用的方法。

由于每个Command对象都是一个COM组件,所以ESRI.ArcGIS.Controls下的各个类只是对底层的COM对象的一种封装。由于是COM对象,所以每一个Command对象都有自己的CLSID和ProgID,并在安装Engine

Runtime的时候被注册了,你可以在注册表的HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\找到这些Command的注册信息,如果要查找所有Command的信息,请访问Built-in
commands。由于是COM组件,在实例化它的过程中,.net需要实例化一个Runtime
Callable Wrapper(RCW)对象,来代理对COM组件的调用。
由于大部分对地图控件的操作都直接或间接的来自于工具栏,比如点击工具栏上面的放大、缩小、全图按钮。那么实际上我们的绝大部分Command对象都可以被寄放到这个工具栏之中。方法非常简单:
axToolbarControl1.AddItem("esriControls.ControlsMapZoomInTool");
此处使用的esriControls.ControlsMapZoomInTool就是ControlsMapZoomInToolClass类所指向的COM组件的ProgID,需要所有这些Command的信息时,你应该到Built-in

commands这个页面下查找,或在你的Engine帮助文档中ms-help://ESRI.EDNv9.2/NET_Engine/b9a335a2-f653-44a1-8961-89051f2e958f.htm的位置。
通过AddItem添加到工具栏中的Command控件使用非常方便,添加了它以后你就再不用操心进一步的处理它与地图控件的交互了。Engine内部是怎么做到这一点的呢,记得我们在第一种方法中实例化一个Command控件时调用的OnCreate方法吗,当时我们传递给它一个MapControl来告诉它需要控制哪一个地图控件。而通过axToolbarControl1.AddItem添加的控件,由于ToolbarControl将这个控件放到自己的控件池时,就已经调用了它的OnCreate方法,并传递给了它自己的BuddyControl作为控制对象,于是,一切都变得简单了。
在实际开发项目中,我们往往不想暴露出ArcEngine内置的ToolBar控件,而是给用户展示我们自己开发的工具栏控件。另一方面,我们也想使用这种简单的添加控件机制。如果做到呢,方法就是在设计阶段,仍然拖放一个ToolbarControl到窗体上,但是在属性中将它的Visible设置为false,这样就不会显示出来了,而我们可以往这个工具栏中添加大量的Command控件。
这个隐藏的工具栏如何使用呢,请看下面这个函数:

public void SetCurrentMapTool(string commandName)
{
//先重置地图当前工具
m_Map.CurrentTool = null;
for (int i = 0; i < m_toolbarControl.CommandPool.Count; i++)
{
    _command = m_toolbarControl.CommandPool.get_Command(i);
    if (_command.Name == commandName)
    {
      m_Map.CurrentTool = _command as ITool;
      _command.OnClick();
      break;
    }
}
}

前面提到ToolbarControl内部维护一个Command池,在这个池中存放了所有已添加的Command对象,获取其中的Command可以通过CommandPool的get_Command方法,通过比较Command的名称,可以得到想要的Command对象。这个名称可不同于ProgID,它是另一个用来标识Command控件的字符串,具体的请在Built-in

commands上查找(第一列),比如我们之前添加的ZoomInTool控件,它的ProgID是esriControls.ControlsMapZoomInTool,它的Name是ControlToolsMapNavigation_ZoomIn。
请注意这一行:
m_Map.CurrentTool = _command as ITool;
当Command对象处理的不只是打开地图,显示全图这类没有与地图交互的功能时,简单的使用OnClick即可,但是当需要的是拖动鼠标控制缩放,空间查询这类必须与地图进行交互的动作时,就必须设置MapControl的CurrentTool属性。
通过上面介绍的方法,就可以不仅利用Toolbar控件管理Command功能,又可以提供丰富的UI,保证表现层的灵活性。
内置的一系列Command控件可以满足我们很多的功能需求,但是仍有稍显不足的时候,比如Identify控件的全英文界面,会使有些用户抓狂。这时,我们可以通过自己开发Command控件来扩展出我们需要的功能,并可以像内置Command一样的使用。以后的文章会给大家来介绍。

来自——“ESRI中国社区 ”

实现对要素节点的编辑操作比如添加、删除等

用如下命令就行:ESRI.ArcGIS.SystemUI.ICommand pCmd = new ControlsEditingEditToolClass();
pCmd.OnCreate(axMapControl1.Object);
axMapControl1.CurrentTool = pCmd as ITool;
可以实现添加、移动,好像不能删除
以上是在IEngineEditor接口下启用编辑,使用该命令。

ArcEngine开发之Command控件使用篇的更多相关文章

  1. Excel催化剂开源第13波-VSTO开发之DataGridView控件几个小坑

    Excel催化剂内部大量使用了DataGridView,这其中有一些小坑,花了力气才解决的,在此给广大开发者作简单分享. 为何要使用DataGridView而不是其他控件如ListBox.ListVi ...

  2. android开发之wheel控件使用详解

    出门在外生不起病呀,随便两盒药60多块钱.好吧,不废话了,今天我们来看看wheel控件的使用,这是GitHub上的一个开源控件,用起来十分方便,我们可以用它做许多事情,比如做一个自定义的datepic ...

  3. android软件开发之TextView控件常用属性

    TextView控件 text属性,设置显示的文本 textColor:设置文本颜色 textSize:设置文本字体大小 autoLink:设置文本为电话,URL连接等的时候是否显示为可点击的链接 c ...

  4. ArcGIS Engine开发之旅07---文件地理数据库、个人地理数据库和 ArcSDE 地理数据库中的栅格存储加以比较 、打开栅格数据

    原文:ArcGIS Engine开发之旅07---文件地理数据库.个人地理数据库和 ArcSDE 地理数据库中的栅格存储加以比较 .打开栅格数据 对文件地理数据库.个人地理数据库和 ArcSDE 地理 ...

  5. Qt 开发 MS VC 控件终极篇

    Qt 开发 MS VC 控件终极篇 1. 使用 MSVC2015 通过项目向导创建 Qt ActiveQt Server 解决方案 项目配置:以下文件需要修改 1. 项目属性页->项目属性-&g ...

  6. AE内置Command控件使用

    樱木 原文 AE内置Command控件使用 直接使用AE内置的Command控件来完成功能 1.拉框放大 /// <summary> /// 放大 /// </summary> ...

  7. ASP.NET MVC显示UserControl控件(扩展篇)

    昨晚Insus.NET有怀旧一下<念念不忘,ASP.NET MVC显示WebForm网页或UserControl控件>http://www.cnblogs.com/insus/p/3641 ...

  8. ActiveX控件(ATL篇)

    目录 第1章 VC++6.0创建    2 1.1 目标    2 1.2 创建项目    2 1.3 增加COM类    4 1.4 属性    7 1.5 事件    8 1.6 实现连接点    ...

  9. ActiveX控件(MFC篇)

    目录 第1章 VC++6.0创建控件    1 1.1 目标    1 1.1.1 方法    1 1.1.2 属性    1 1.1.3 事件    1 1.2 创建项目    2 1.3 项目结构 ...

随机推荐

  1. angularjs 合并单元格

    Html: <table class="table table-striped"> <thead> <tr> <th>国家</ ...

  2. SQLITE数据表主键设置Id自增方法

    SQLITE数据表主键设置Id自增方法 标签: sqliteintegerinsertnulltableapi 2010-01-12 08:39 35135人阅读 评论(8) 收藏 举报  分类: S ...

  3. 【2017 Multi-University Training Contest - Team 7】 Euler theorem

    [Link]:http://acm.hdu.edu.cn/contests/contest_showproblem.php?pid=1005&cid=765 [Description] 问你a ...

  4. 腾讯2016实习生面试经验(已经拿到offer)

      忐忑了好几天,今天最终收到深圳总部的电话.允许录用我为2016年实习生,感觉整个天空都放晴了.坐标:武汉大学,给大家说说我的面试经历吧,我投的是软件开发--应用开发方向. 一.校招流程 投递简历- ...

  5. 文字记录而已!!人民币直充/兑换PayPal美金

    人民币直充/兑换PayPal美金 用PAYPAL国际使用外国货币,没有信用卡是不能冲值的,到淘宝买吧,被骗的几率大一些,弄来弄去,PAYPAL被冻结. 今天朋友介绍使用 中美互动网 让它给自己的PAY ...

  6. vue使用jsonp

    axios不支持jsonp,所以需使用其他插件:vue-jsonp npm i vue-jsonp -S 然后在 src/main.js : import Vue from 'vue' import ...

  7. css实现背景半透明文字不透明的效果

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  8. 【AtCoder Regular Contest 082】Derangement

    [链接]点击打开链接 [题意] 在这里写题意 [题解] 贪心. 连续一块的p[i]==i的话,对答案的贡献就应该为(这个连续块的长度+1)/2; 长度为1的也正确. (也即两两相邻的互换位置.) [错 ...

  9. 【】maze

    [链接]点击打开链接 [题意] 小 T 被放到了一个迷宫之中,这个迷宫由 n 个节点构成,两个节点之间可能存在多条无 向边,小 T 的起点为 1 号节点,终点为 n 号节点.有 m 条无向边,对于每一 ...

  10. NodeJS服务端重构计划

    不知不觉做node开发已经半年时间了.这期间写尝试着去攻克了一些问题.实现了一下想法,也遇到过一些坑. 是时候来梳理一下代码,规划一下接下来的工作. 现阶段我们的nodeserver端代码结构是这种: ...