转自:http://www.cnblogs.com/xzbluemap/archive/2012/12/13/2816138.html

如果要使用ArcEngine开发GIS系统的话,首先我们用到的就是MapControl和TocControl以及ToolBarControl。用这三个UI我们就能做出一个简单的GIS系统。MapControl是显示数据用的,TocControl是显示地图数据树用的,ToolBarControl就是放置命令和工具的载体。TooBarControl是一个命令和工具的载体UI,上面可以放很多命令和工具,我们可以猜想ToolBarControl可能能够接受一个接口或者基类,这样我们就可以往这个工具条上加很多继承该接口或基类的命令和工具。

这个接口就是ICommand,该接口在ArcEngine中是一个特别重要的接口,是Engine体系中组织功能的接口。例如我们在工具条上使用的打开地图、加载数据、放大、缩小等都是继承至该接口,同样我们在扩展Engine的功能时要让这样功能体现的界面上,入口我们一般也是继承ICommand接口,然后这些接口就可以和Engine已经提供的命令一起使用了。从该接口的命名上我们也可以看出,该接口是一个命令接口。该接口直接执行某个个动作,而不和地图发生交互。想Engine中ControlsMapZoomInFixedCommand、ControlsMapZoomOutFixedCommand工具都是直接继承ICommand的,可以理解成点击这些按钮执行命令后,地图就进行放大或缩小,而不需要和地图交互。还有一点就是命令时无状态的,例如我们在使用ArcMap时,当你点一下菜单栏上的按钮,立即响应该功能,而该按钮还是正常状态,没有被按下去,一般该按钮就是一个命令,但也有特殊情况,有可能按钮按下去预示着是某种状态。

Engine中ICommand的定义如下:

using System;
using System.Runtime.InteropServices;namespace ESRI.ArcGIS.SystemUI
{[TypeLibType(256)][Guid("36B06538-4437-11D1-B970-080009EE4E51")][InterfaceType(1)]public interface ICommand{[DispId(1610678280)][ComAliasName("ESRI.ArcGIS.esriSystem.OLE_HANDLE")]int Bitmap { get; }[DispId(1610678275)]string Caption { get; }[DispId(1610678281)]string Category { get; }[DispId(1610678273)]bool Checked { get; }[DispId(1610678272)]bool Enabled { get; }[DispId(1610678279)]int HelpContextID { get; }[DispId(1610678278)]string HelpFile { get; }[DispId(1610678277)]string Message { get; }[DispId(1610678274)]string Name { get; }[DispId(1610678276)]string Tooltip { get; }void OnClick();void OnCreate(object hook);}
}

该接口定义了命令的标题、图标、提示信息等属性,并定义了初始化、点击响应的函数。基本上和我们在ArcMap上看到的信一致。

那需要和地图交互的功能如何定义呢?ITool接口。Engine中提供了ITool接口用来提供和地图交互的一些功能。

Engine中ITool接口的定义如下:

namespace ESRI.ArcGIS.SystemUI
{[Guid("2A6B0172-4ED2-11D0-98BE-00805F7CED21")][InterfaceType(1)][TypeLibType(256)]public interface ITool{[ComAliasName("ESRI.ArcGIS.esriSystem.OLE_HANDLE")][DispId(1610678272)]int Cursor { get; }bool Deactivate();bool OnContextMenu(int x, int y);void OnDblClick();void OnKeyDown(int keyCode, int shift);void OnKeyUp(int keyCode, int shift);void OnMouseDown(int button, int shift, int x, int y);void OnMouseMove(int button, int shift, int x, int y);void OnMouseUp(int button, int shift, int x, int y);void Refresh(int hdc);}
}

因为工具是要和地图交互的,和地图交互主要是靠鼠标和键盘,所以ITool接口中包含了一些和鼠标键盘交互的函数。例如鼠标按下、鼠标移动、鼠标弹起,键盘的按下和弹起等。既然ITool也是和ICommand的并列的可以在界面显示的一个按钮,那为什么ITool接口没有标题、图标,提示信息以及状态这些属性呢?我不知道Engine的设计人员是怎么考虑的,我个人认为在Engine里面ITool接口是应该继承ICommand接口比较合适。

不过虽然ITool接口没有继承ICommand接口,但我们一般很少直接去继承者两个接口的,Engine里面为我们提供了BaseCommand和BaseTool两个基类,BaseCommand是继承ICommand接口的基类,这个是很明显的,而BaseTool即继承了ITool接口还继承了ICommand接口。这也验证了我们上面说的工具也是一个命令。

四个接口和类的继承关系如下:

命令是无状态的,而工具是有状态的,一个主控件(MapControl、PagelayoutControl、GlobeControl、SceneControl)都有CurrentTool属性,也就是说整个系统当前的工具只有一个。这个我们很容易理解,因为电脑一般情况下只有一个鼠标和一个键盘,要响应鼠标和键盘的事件,只能是一个工具。如果想切换工具时,直接给这些控件的CurrentTool属性赋值就可以了。

当前工具属性定义如下:

namespace ESRI.ArcGIS.Controls
{[Guid("D00F1736-7A95-4F5E-B54F-E2863C425DC3")][TypeLibType(256)][InterfaceType(1)]public interface IToolbarBuddy{[DispId(1610678272)]ITool CurrentTool { get; set; }}
}

虽然该属性定义到了IToolbarBuddy接口上了,但MapControl、PagelayoutControl、GlobeControl、SceneControl这四个控件对象都是继承该接口的。

在给此参数赋值后,系统会自动调用上个工具的Deactive函数,把上个工具的Checked属性设置为False,调用当前新赋的工具的OnCreate函数,并把Checked属性设置为True,这样两个工具就自动的切换了。上个工具会为Deactive中做一些清理工作,例如没有画完的线,定位留下的高亮数据等。按钮的选中状态也做了相应的变化。新赋值的工具在OnCreate函数中做一些初始化操作。

此时当鼠标再在地球上做一下点击移动操作时,系统响应的就是新赋的工具的鼠标点击、移动函数。

命令就更简单了,除了初始化函数之外,就是OnClick函数了,Onclick函数就是该命令的主功能函数,命令的响应就写到该函数中。

转载于:https://www.cnblogs.com/Joetao/articles/5739986.html

ArcEngine中的ICommand和ITool(转载)相关推荐

  1. ArcEngine中使用上下左右键移动地图

    转自愿文ArcEngine中使用上下左右键移动地图 因项目需要,需对mapcontrol控件响应上下左右键,从网上找的方法都一样,都值提到了需要设置axMapControl1的KeyIntercept ...

  2. ArcEngine中多边形内外环的处理(转)

    ArcEngine中多边形内外环的处理 原创 2012年09月06日 22:49:11 标签: object / null / 数据库 3462 Polylgon对象是由一个或多个Ring对象的有序集 ...

  3. ArcEngine中shp中先加入要素然后删除一部分要素后,放大图形后不显示的问题解决方法...

    ArcEngine中shp中先加入要素然后删除一部分要素后,放大图形后不显示的问题解决方法 (一)问题描述如下: shp中先加入要素然后删除一部分要素后,图形为什么显示不正常了 //--------- ...

  4. ArcEngine中打开各种数据源(WorkSpace)的连接

    ArcEngine中打开各种数据源(WorkSpace)的连接 (SDE.personal/File.ShapeFile.CAD数据.影像图.影像数据集) ArcEngine 可以接受多种数据源.在开 ...

  5. ArcEngine中IFeatureClass.Search(filter, Recycling)方法中Recycling参数的理解

    转自 ArcEngine中IFeatureClass.Search(filter, Recycling)方法中Recycling参数的理解 ArcGIS Engine中总调用IFeatureClass ...

  6. python中的定制类(转载)

    python中的定制类(转载)<?xml version="1.0" encoding="UTF-8"?> 看到类似__slots__这种形如__x ...

  7. ASP.NET MVC 3: Razor视图引擎中 @: 和text 语法【转载】

    ASP.NET MVC 3: Razor视图引擎中 @: 和<text> 语法[转载] (文章没翻译:建议大家读英文原文,看不懂查着看,顺便提高自己的英语水平!) In today's p ...

  8. 从系统中取得指定资源图像(转载)

    从系统中取得指定资源图像(转载) 在Winuser.h中定义了一些系统常用的资源,比如对话框的图标,某些按钮上的图像等. 以下是部分OEM资源序号和一些标准ICON的ID: //----------- ...

  9. ArcEngine 中的-2147467259错误

    近日在ArcEngine中做InsertFeature(向*.mdb数据中添加要素)操作时出现了-2147467259错误. 由于代码在之前的测试中没有上述异常,遂怀疑是数据问题.经过排查,发现数据的 ...

  10. R语言中的数学计算(转载)

    R语言中的数学计算 关于作者: 张丹(Conan), 程序员Java,R,PHP,Javascript weibo:@Conan_Z blog: http://blog.fens.me email: ...

最新文章

  1. 如何彻底卸载mysql(xp)
  2. Struts2学习第二天——动态方法调用
  3. python 提交form-data之坑
  4. LeetCode: 2_Add Two Numbers | 两个链表中的元素相加 | Medium
  5. r720支持多少频率的内存吗_关于内存频率,高频和低频的性能差距大吗?明白这3点很重要...
  6. XML数据读取——Digester简单使用
  7. 安装JDK 9与使用jshell
  8. C#自动识别文件编码
  9. docker elasticsearch安装
  10. 电赛公开课整理(二),电路基础,截图+模电知识【16000字】【原创】
  11. 概率论与数理统计公式整理
  12. python金融衍生品大数据分析 pdf_Python金融衍生品大数据分析:建模、模拟、校准与对冲...
  13. golang 实现 tcp-聊天室
  14. cocos2dx实例开发之经典三消
  15. Markdown基础总结
  16. 原像、第二原像、碰撞;随机预言机;生日攻击
  17. 程序员或IT人应该吃的东西
  18. MVP、EMC、CRM、IoT、边缘计算盒子、系统群控、数字化赋能、EMS、冷媒
  19. tolua wrap原理与使用
  20. Redis教程(上课笔记)

热门文章

  1. 哈希算法(哈希函数)基本
  2. 再说打日志你不会,pm2 + log4js,你值得拥有
  3. 谁在叩响野蛮人的家门?
  4. php架构师培训,php架构师培训效果怎么样
  5. 计算机图形学——反走样技术
  6. 编码人大脑的5大小吃
  7. sql语句左连接时的ON AND用法
  8. 中文文本蕴含计算项目(88万中文文本蕴含数据集+中文文本蕴含模型)
  9. [PTA] 7-6 厘米换算英尺英寸
  10. 数据准备脚本:Python Pandas OR esProc SPL?