随笔 - 32  文章 - 0 评论 - 156 trackbacks - 36
<2008年8月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
31123456

与我联系

搜索

 

常用链接

留言簿(3)

我的标签

随笔分类

随笔档案

相册

收藏夹

积分与排名

  • 积分 - 46021
  • 排名 - 1076

最新评论

阅读排行榜

评论排行榜

上一篇文章提到了如何灵活地使用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 on 2008-01-18 16:10 Ren 阅读(1370) 评论(2)  编辑 收藏 网摘 所属分类: .netArcEngine

FeedBack:
#1楼  2008-05-07 15:18 lyy [未注册用户]
请问,用vb进行AE开发,如何在一个toolbarcontrol中加载自定义的command? 谢谢! 能不能具体讲一下,我是初学的。
  回复  引用    
#2楼  2008-08-15 11:28 garu [未注册用户]
非常棒,谢谢
COPY了学习一下
  回复  引用    

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
Google站内搜索
[推荐职位]上海盛大网络招聘架构师



China-pub 计算机图书网上专卖店!6.5万品种 2-8折!
近千种 9-95 新二手计算图书火热销售中!
开发者征途系统新作:《设计模式——基于C#的工程化实现及扩展》

相关文章:

相关链接: