利用ICommand和ITool重写Arcengine中控件的事件
Arcengine窗体开发中,不同命令或者工具可能会触发同一控件的同一事件,这样会造成该事件中代码的混乱。以主窗体的AxMapcontrol控件为例,当开始画图时因为有很多种类型的Feature,所以在AxMapcontrol控件的OnMouseDown、OnMouseMove、OnMouseUp等事件中都需要作相应的处理。
最简单的方法时利用if语句在各事件中做状态判断,来执行相应的语句。但是当你的程序达到一定规模的时候,你的这些事件中的代码将变的非常庞大,严重影响代码的可读性和可维护性,如图一所示。
图1 未重载事件代码组织结构
下面介绍一种利用ARCGIS自带的ICommand和ITool模板重写控件事件。如下图所示
图2 重载事件代码组织结构
当需要编写某功能时,通过利用ICommand和ITools重写控件的事件,只需要将该功能需要执行的代码写入事件的重写中即可,程序一目了然,可读性和整体思路都会更将清晰。
下面是具体的操作步骤:
- 创建一个能运行的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中控件的事件相关推荐
- 第三部分:MFC中控件的样式
2019独角兽企业重金招聘Python工程师标准>>> 第三部分:MFC中控件的样式 控件是用来建立Windows应用程序用户界面的用户界面对象.你所见到的大部分Windows应用程 ...
- 用Cocos Studio 2.3.2制作UI界面中控件不再支持运行3d动作特效
用Cocos Studio 2.3.2制作UI界面中控件不再支持运行3d动作特效 cocos2d-x + cocos studio无疑是当下二维手游开发的利器,但是在从旧版本向新版本的升级过程中,坑 ...
- vue树形结构html,怎么在vue中利用递归组件实现一个树形控件
怎么在vue中利用递归组件实现一个树形控件 发布时间:2021-06-11 17:26:48 来源:亿速云 阅读:81 作者:Leah 本篇文章为大家展示了怎么在vue中利用递归组件实现一个树形控件, ...
- activex 控件的id 定义位置+使用ocx控件的客户端程序中对控件定义的文件中控件id定义的位置...
activex 控件的id 定义位置 // SuperDisplayCtl.cpp IMPLEMENT_OLECREATE_EX(CSuperDisplayCtrl, "SuperDispl ...
- Repeater 操作HeaderTemplat或FooterTemplat模板中控件
获取HeaderTemplat模板中控件 LinkBtn = rp.Controls[0].FindControl("LinkBtnMoreDel") as LinkButton; ...
- android: 静态XML和动态加载XML混合使用,以及重写Layout控件
近期对android里面控件修改做了很多实验,由于公司需求很多,不得不重写很多控件.程序目标无非是:高效.轻巧.清晰.标准化 完成动态加载Layout有两种方法,依据个人喜好进行选择: 方法1:静态主 ...
- c#在WinForm中重写ProgressBar控件(带%的显示)
c#在WinForm中重写ProgressBar控件(带%的显示) 2009-05-14 13:13 #region 定义textProgressBar控件的类 namespace csPublish ...
- C#中控件Control的Paint事件和OnPaint虚函数的区别
句柄 : 句柄,是整个Windows编程的基础.一个句柄是指使用的一个唯一的整数值,即一个4字节(64位程序中为8字节)长的数值,来标识应用程序中的不同对象和同类对象中的不同的实例,诸如,一个窗口,按 ...
- 自定函数获取datagrid,datalist,rpeater控件中header,footer栏中控件
在论坛上看到很多关于datagrid,gridview,datalist,rpeater提取header,footer中控件的问题,整理了一下.供大家分享 下面我以DataGrid为便进行说明. fo ...
- vs2010 设计视图中控件无法加载,提示未将对象设置到对象的实例。
vs2010 设计视图中控件无法加载,提示未将对象设置到对象的实例 的 解决方法 解决方案: 卸载掉你机器的所有silverlight插件,然后重启 ! 搞定 如果想使用silverlig ...
最新文章
- python变量域名_Python实现从url中提取域名的几种方法
- Nginx配置与使用
- [转]两个经典的windbg调试案例,值得学习。
- 干货!无需任何工具,实测macOS双开微信客户端
- 阿里高级技术专家张建飞:应用架构分离业务逻辑和技术细节之道
- 阿里巴巴最新区块链专利申请文件解读
- 荐书 | 9本心理治疗书籍推荐
- 女明星对比潮人HOLD姐的妖艳妆容
- 分享5款小众软件,大家按需下载
- 数据预处理(三)——数据集成
- 科技发烧友之3d吉米投影
- OGG遇到相关问题汇总
- 第八章_集合(3)_Map集合Stream流
- Vue的patch算法(了解)
- 25、软件安全-预防账号密码泄露
- 基于FPGA的交通灯
- 供应链金融智能合约整理
- 数据分析:什么是业务?全面解析问题
- 2022年4月14日-1
- 现在国内程序员的薪水是什么行情?
热门文章
- 教会如何使用WordPress提供在线讲道
- org.apache.hadoop.hbase.ipc.ServerNotRunningYetException: Server is not runn Hbase shell 无法执行命令
- 用犯罪分析软件CrimeStat做热点图、层次空间聚类图、时空移动平均图
- sql语句左连接时的ON AND用法
- GitHub下载 无法分配请求的地址_百度网盘破限速软件PanDownload复活了!60MB/s!附下载地址...
- pyecharts对于经纬度_echarts 根据经纬度坐标在地图上描点
- 千人千面算法java实现_推荐算法-recommend_system
- CG CTF RE Py交易
- Thematic Contests -codeforce
- oracle.exe占用cpu太高,360tray.exe占用CPU过高,怎么办