ArcEngine开发之Command控件开发篇

上一篇文章提到了如何灵活地使用ArcEngine内置的Command控件,如果这些控件已经满足你的功能需求,就尽量使用它们,因为ArcEngine的开发一旦开始自己coding,往往遇到大量的代码量和性能问题。而ArcEgnine的SDK提供了很多减轻开发人员负担的模板、代码段、示例等等。下面我们对Command控件进行的扩展就利用了SDK提供的模板。

由于Command对象封装了太多的信息,往往使用很方法,进行扩展却不易。比如内置的Identify控件,你只需要在工具栏中添加它就可以了:
axToolbarControl1.AddItem("esriControls.ControlsMapIdentifyTool");

它的功能极其完善,到与ArcDesktop提供的Identify工具几乎一样。但是我们想自定义弹出的对话框,省掉一些功能,把界面中文化,对不起,No door~。于是我们只好硬着头皮自己开发Identify功能,还有诸如EditingToolbar,MeasureTool这些控件都存在这样的烦恼。开发它们的难度是很大的,但是利用SDK提供的模板还是可以扫清基本思路上的障碍,并且开发出来以后可以在不同项目中重用。

思路是这样,要使自己开发的Command控件能够像内置控件那样方便使用,你需要将你的Command类实现ICommand接口,如果进一步,这个Command会持久地与MapControl交互,你还需要实现ITool接口。比这高明一点的方法是继承自BaseCommand或BaseTool抽象类。这样需要手工编写实现的代码更少。最高明的
方法则是使用SDK提供的模板创建这样的Command控件。
在项目中选择添加新项,选择ArcGIS类别下的模板Base Command或Base Tool,如图:


点击确定之后会弹出一个对话框,让你选择要创建的Command适用的ArcGIS组件,选择MapControl or PageLayoutControl Command则可使Command用在普通的平面地图控件上。


最终生成的代码文件中,创建了一个类,继承自BaseCommand,提供了可供COM识别的一系列标签,实现了BaseCommand的必要方法OnCreate和OnClick。其中重要的部分说明如下:
  • [Guid("4f2b2bfe-3f62-43ca-9ed3-36c8d233280c")]:使这个全局ID使此组件可以注册在你的电脑上;
  • [ProgId("GTLControls.Command2")]:提供了这个COM组件的ProgId,这成为调用AddItem时传入的参数。
  • base.m_name:这个名称成为你在查找Command时进行比较的字符串名称。
  • OnCreate:方法中传递的参数hook成为绑定到这个Command控件的交互对象,被保存在一个IHookHelper成员变量中,通过该成员的Hook属性即可获得对交互对象(往往是MapControl的弱引用)。
同时被创建的还有一个bmp图片,是被添加到工具栏时显示的按钮图片,默认是一个傻傻的兔子。

你需要实现的逻辑往往被放置在OnClick方法中。通过观察其中的TODO注释你可以找到在哪里开始编写自己的代码。

在此没有必要对一个具体的Command对象如何实现进行更详细的说明,但要使一个自己开发的Command正常工作还是需要注意以下几点:

1、这个Command必须位于一个Library项目中,当在一个exe项目中创建这样一个Command对象会无法使用,或者是我还没找到正确的办法。
2、这个Library项目的属性需要勾选为COM Interop注册选项,在生成选项卡下。
3、不要忘记在使用它的项目中添加对这个Library项目的引用。
posted @ 2008-01-18 16:10  老枪911  阅读(3614)  评论(4编辑  收藏  举报