Arcengine窗体开发中,不同命令或者工具可能会触发同一控件的同一事件,这样会造成该事件中代码的混乱。以主窗体的AxMapcontrol控件为例,当开始画图时因为有很多种类型的Feature,所以在AxMapcontrol控件的OnMouseDown、OnMouseMove、OnMouseUp等事件中都需要作相应的处理。

  最简单的方法时利用if语句在各事件中做状态判断,来执行相应的语句。但是当你的程序达到一定规模的时候,你的这些事件中的代码将变的非常庞大,严重影响代码的可读性和可维护性,如图一所示。

图1 未重载事件代码组织结构

  下面介绍一种利用ARCGIS自带的ICommand和ITool模板重写控件事件。如下图所示

图2 重载事件代码组织结构

当需要编写某功能时,通过利用ICommand和ITools重写控件的事件,只需要将该功能需要执行的代码写入事件的重写中即可,程序一目了然,可读性和整体思路都会更将清晰。

下面是具体的操作步骤:

  1. 创建一个能运行的windows窗体程序,带有两个菜单命令、两个工具命令和一个mapcontrol控件,如图3所示。这部分比较简单,具体实现不再敖述。

图3.窗体设计

  2.添加ICommand类型扩展项

  ICommand主要用于重载菜单或者工具中点击之后立刻执行没有后续操作的功能,如创建新图层。

  具体操作如下:右键--à添加--à新建项,在左侧已安装的模板中选择ArcGIS--àExtending ArcObjects,在右侧选择”base command”,并填写文件名,这里我写的是OverwriteCommand1。在出现的”ArcGIS New Item Wizard Option”窗口中选择”MapControl or PageLayoutControl Command”,确定后解决方案资源管理器中将出现”OverwriteCommand1.cs”和”OverwriteCommand1.bmp”两个文件,表明已经添加成功。

在””OverwriteCommand1.cs”文件的OnClick()函数中添加具体的功能代码,并在“菜单1”的Click事件中添加如下代码:

pCmd = new OverwriteCommand1();

pCmd.OnCreate(axMapControl1.Object);

pCmd.OnClick();

同理,为”toolStripButton1”创建对应文件”OverwriteCommand2.cs”文件,并在Click方法中写入功能。在”toolStripButton1”的click事件中添加如下代码:

pCmd = new OverwriteCommand2();

pCmd.OnCreate(axMapControl1.Object);

pCmd.OnClick();

解释:pCmd为ICommand类型的全局对象,第一行利用OverwriteCommand1类的构造函数实例化pCmd对象。第二行将AxMapControl1的基类信息利用OverwriteCommand1的OnCreate方法传递给pCmd变量。第三行则是调用pCmd对象OnClick方法。

  3.添加ITool类型扩展项

ITools类型的扩展实现重写主要用于传递状态,方便有后续步骤的功能,如点击画图按钮后,需要在mapcontrol的onMouseDown、onMouseMove和onMouseUp等事件编写对应功能。

创建文件步骤如上,只是当出现在“添加新项”窗口中选择”Base Tool”而不是”Base Command”。确定后将成功创建”OverwriteTool1”和”OverwriteTool2”文件,这两个文件中除click事件,添加了OnMouseDown、OnMouseMove和OnMouseUp方法。将对应的功能写进这三个方法中。

在”菜单2”和”toolStripButton2”中分别写入如下文件:

pCmd = new OverwriteTool1();

pCmd.OnCreate(axMapControl1.Object);

axMapControl1.CurrentTool = pCmd as ITool;

pCmd = new OverwriteTool2();

pCmd.OnCreate(axMapControl1.Object);

axMapControl1.CurrentTool = pCmd as ITool;

解释:ITool类型和ICommand类型在调用时唯一的区别是第三行,ICommand类型是直接调用,而ITool则是将pCmd接口跳转成ITool类型后传递给AxMapControl1对象的CurrentTool属性。这事实上是状态的传递,传递成功后”菜单2”和”toolStripButton2”中重写的OnMouseDown、OnMouseMove和OnMouseUp将覆盖AxMapControl1对象原先的事件。

转载于:https://www.cnblogs.com/gisvito/p/4452251.html

利用ICommand和ITool重写Arcengine中控件的事件相关推荐

  1. 第三部分:MFC中控件的样式

    2019独角兽企业重金招聘Python工程师标准>>> 第三部分:MFC中控件的样式 控件是用来建立Windows应用程序用户界面的用户界面对象.你所见到的大部分Windows应用程 ...

  2. 用Cocos Studio 2.3.2制作UI界面中控件不再支持运行3d动作特效

    用Cocos Studio 2.3.2制作UI界面中控件不再支持运行3d动作特效  cocos2d-x + cocos studio无疑是当下二维手游开发的利器,但是在从旧版本向新版本的升级过程中,坑 ...

  3. vue树形结构html,怎么在vue中利用递归组件实现一个树形控件

    怎么在vue中利用递归组件实现一个树形控件 发布时间:2021-06-11 17:26:48 来源:亿速云 阅读:81 作者:Leah 本篇文章为大家展示了怎么在vue中利用递归组件实现一个树形控件, ...

  4. activex 控件的id 定义位置+使用ocx控件的客户端程序中对控件定义的文件中控件id定义的位置...

    activex 控件的id 定义位置 // SuperDisplayCtl.cpp IMPLEMENT_OLECREATE_EX(CSuperDisplayCtrl, "SuperDispl ...

  5. Repeater 操作HeaderTemplat或FooterTemplat模板中控件

    获取HeaderTemplat模板中控件 LinkBtn = rp.Controls[0].FindControl("LinkBtnMoreDel") as LinkButton; ...

  6. android: 静态XML和动态加载XML混合使用,以及重写Layout控件

    近期对android里面控件修改做了很多实验,由于公司需求很多,不得不重写很多控件.程序目标无非是:高效.轻巧.清晰.标准化 完成动态加载Layout有两种方法,依据个人喜好进行选择: 方法1:静态主 ...

  7. c#在WinForm中重写ProgressBar控件(带%的显示)

    c#在WinForm中重写ProgressBar控件(带%的显示) 2009-05-14 13:13 #region 定义textProgressBar控件的类 namespace csPublish ...

  8. C#中控件Control的Paint事件和OnPaint虚函数的区别

    句柄 : 句柄,是整个Windows编程的基础.一个句柄是指使用的一个唯一的整数值,即一个4字节(64位程序中为8字节)长的数值,来标识应用程序中的不同对象和同类对象中的不同的实例,诸如,一个窗口,按 ...

  9. 自定函数获取datagrid,datalist,rpeater控件中header,footer栏中控件

    在论坛上看到很多关于datagrid,gridview,datalist,rpeater提取header,footer中控件的问题,整理了一下.供大家分享 下面我以DataGrid为便进行说明. fo ...

  10. vs2010 设计视图中控件无法加载,提示未将对象设置到对象的实例。

    vs2010 设计视图中控件无法加载,提示未将对象设置到对象的实例 的 解决方法   解决方案: 卸载掉你机器的所有silverlight插件,然后重启 !   搞定   如果想使用silverlig ...

最新文章

  1. 全球半导体产业迁移 中国的机遇与挑战
  2. 转:Community Clips 使用指南
  3. xcode 允许SVN管理项目文件
  4. 空调吸气和排气_吸气剂和二传手被认为有害
  5. java 接口 print_Java-接口练习
  6. arcgis js api前端完成面积测算
  7. 南水北调真相 林凌刘世庆范晓做客四川新闻网
  8. java跳_用Java实现跳表
  9. 一款基于jQuery底部带缩略图的焦点图
  10. pb dw graph增加series_如何快速增加tiktok视频的播放量
  11. android canvas_Android实现自定义阴影效果
  12. 数据结构之SWUSTOJ1038: 顺序表中重复数据的删除
  13. 一个QQ用户名/密码钓鱼分析
  14. Sails基础之View层
  15. intel无线网络管理服务器,配置Intel无线网卡连接到管理帧保护(MFP) -启用网络
  16. [Qt]使用QSS的扁平化风格的小作业—— 附源码
  17. Codeforces Contest 1138 problem B Circus —— 死亡1700,暴力
  18. 2-4 第18次课 高项之沟通管理与干系人管理
  19. MAC PS用图片一个区域的颜色替换另一地方
  20. Gym - 102263 B - Road to Arabella

热门文章

  1. CMPP错误码(zzzz)
  2. 大龄女计算机考研去当老师,考研、考公务员、当老师!哪个更适合女生?史上最强答案给你!...
  3. 置信区间、P值那点事
  4. Debian没有reboot命令
  5. 【寻找最佳小程序】11期:车来了——时时公交就在你身边,到站准确率可控制在90%以上...
  6. 微信服务号 权限 access_token 失效问题
  7. android软件多版本共存,1. android studio 多版本共存(2.2 and 3.3)
  8. 数据库mysql实训报告_数据库实训报告.doc
  9. 「Android高级工程师」BAT大厂面试基础题集合-下 Github标星6.5K
  10. 「Android高级工程师」BAT大厂面试基础题集合-下-Github标星6-5K