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对象原先的事件。

利用ICommand和ITool重写Arcengine中控件的事件的更多相关文章

  1. duilib中控件拖拽功能的实现方法(附源码)

    转载请说明原出处,谢谢~~:http://blog.csdn.net/zhuhongshu/article/details/41144283 duilib库中原本没有显示的对控件增加拖拽的功能,而实际 ...

  2. C#中控件数组的讨论

    VB用得习惯后,到C#中来觉得很奇怪,如此好的控件数组怎么不见了.“众所周知,控件数组最主要的两个优点:可以循环附值:可以响应同一个事件.从而大大简化了代码.引自http://wenku.baidu. ...

  3. WPF 中获取DataGrid 模板列中控件的对像

    WPF 中获取DataGrid 模板列中控件的对像 #region 当前选定行的TextBox获得焦点 /// <summary> /// 当前选定行的TextBox获得焦点 /// &l ...

  4. Metro中控件WebView访问外部的网页显示一片空白

    Metro中控件WebView访问外部的网页显示一片空白 解决方案: ​下载安装了Initex.Software.Proxifier.v3.21.Standard.Edition.Incl.Keyma ...

  5. form表单中控件较多,加载完成后切换页面都很慢的解决方法

    form表单中控件较多,加载完成后点击都很慢,为什么?我一页面中form表单里面上百个控件(如input.select.radio.checkbox等),还有一些js脚本,加载速度还可以,都能全部显示 ...

  6. C#中控件的CheckState和Checked属性区别?

    Checked 和CheckState都是检查控件选中状态,都能判断是否选中控件. 只是Checked 通过布尔判断(true & false): CheckState 通过枚举判断. che ...

  7. MFC中控件的TAB顺序 ----转载

    在MFC中添加控件后,按Ctrl+d可以改变控件TAB顺序,怕自己忘了,一个神奇的东西,记下. 关于改变Tab顺序的方法有以下几种: 方法一:在动态创建控件的时候STYLE设置成为WS_CHILD|W ...

  8. WPF自定义控件(二)の重写原生控件样式模板

    话外篇: 要写一个圆形控件,用Clip,重写模板,去除样式引用圆形图片可以有这三种方式. 开发过程中,我们有时候用WPF原生的控件就能实现自己的需求,但是样式.风格并不能满足我们的需求,那么我们该怎么 ...

  9. WPF中控件的显示与隐藏

    1.WPF中控件的显示与隐藏的属性是 Visibility,它有3个枚举值 Visible, Hidden 和 Collapsed.其中Visible为可见,而 Hidden 和 Collapsed ...

随机推荐

  1. 让WordPress的作者在后台只能看到自己的文章

    今天需要对WordPress后台进行调整,目的是为了只能让当前用户看见自己所发表的文章,而WordPress默认是登陆用户可以看到所有用户发表的文章. WordPress中的用户角色分的比较详细,作者 ...

  2. Oracle字符函数(转换大小写,替换等)

    在oracle中,有一些字符函数: upper(字符串):转换为大写lower(字符串):转换为小写initcap(字符串):首字母大写replace(字符串1,字符串2,字符串3):将串1中所有的串 ...

  3. Bitly缩短网址服务 - Blog透视镜

    网站的网址过长或是含有非英文或数字符号,会导致在BBS或者微网志中分享给好友时,产生很多的不方便,Bitly是个缩短网址服务的网站,提供1个短网址转向指定到长网址,免费使用且提供统计报表,例如本篇文章 ...

  4. tessnet2 在vs2010 及以上版本不能调用的解决方案

    <startup useLegacyV2RuntimeActivationPolicy="true"> <supportedRuntime version=&qu ...

  5. Flume Channel

    http://blog.csdn.net/john_f_lau/article/details/20913831 http://dev.cmcm.com/archives/194

  6. perl 对象 通过bless实现

    对象只是一种特殊的引用,它知道自己是和哪个类关联在一起的,而构造器知道如何创建那种关联关系. 这些构造器是通过使用bless操作符,将一个普通的引用物转换成一个对象实现的,

  7. 【转】(总结)Linux下su与su -命令的本质区别

    原文网址:http://www.ha97.com/4001.html 本人以前一直习惯直接使用root,很少使用su,前几天才发现su与su -命令是有着本质区别的! 大部分Linux发行版的默认账户 ...

  8. Hdu5126-stars(两次CDQ分治)

    题意: 简化就是有两种操作,一种是插入(x,y,z)这个坐标,第二种是查询(x1,y1,z1)到(x2,y2,z2)(x1<=x2,y1<=y2,z1<=z2)的长方体包含多少个点. ...

  9. 本地plsqldev.exe连接远端oracle数据库

    先看百度经验:http://jingyan.baidu.com/article/48b558e3540ecf7f38c09a3c.html 这里如果我们只有安装plsql工具,下载oracle精简版本 ...

  10. linux下的守护进程及会话、进程组

    守护进程.会话.进程组网上有许多不错的资料.我也是网上搜罗了一堆,加上自己的理解.不敢说原创,只是写在这怕自己忘记罢了.才疏学浅,难免有错误,欢迎大家指正.下面这篇写很不错,大家可以去看看:http: ...