利用ICommand和ITool重写Arcengine中控件的事件

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

时间: 2024-10-08 01:07:56

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

C#中使用多线程访问Winform中控件的若干问题

我们在做winform应用的时候,大部分情况下都会碰到使用多线程控制界面上控件信息的问题.然而我们并不能用传统方法来做这个问题,下面我将详细的介绍. 首先来看传统方法: public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { Thread thread = new Thread(Thread

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

转载请说明原出处,谢谢~~:http://blog.csdn.net/zhuhongshu/article/details/41144283 duilib库中原本没有显示的对控件增加拖拽的功能,而实际使用过程中拖拽功能也是有用武之地的.看群里有人问题duilib怎么支持拖拽,我也就写这篇文章说明一下duilib实现控件拖拽的方法. 当我刚接触duilib不就的时候,考虑过duilib拖拽这个功能,当时的想法是,在xml布局中设置一个浮动的控件,正常状态下他是隐藏的,当出发了拖拽条件后将他显示并且

Android中控件的宽高

1.在一个Relatitivelayout布局里用代码add一个独立的button布局,结果该button的宽高无效 则说明:Android中控件默认是没有宽高的,只有五大布局才能给其宽高,即在代码中要设置控件的宽高需要使用福控件的layoutparams 命名规则:layout_width 想通的:layout_gravity和gravity 2.直接在activity中setContentView里引用最外层为button的布局,则也有宽高 原因:android默认在最外层给添加了Frame

问题解决——MFC SDI程序 CFormView中控件随窗口缩放

从来都是做对话框程序,这次想做个SDI的程序,想着用一下带Robbin界面的office2007风格,就不用使用那些花钱的商业控件/UI库了. 如果你不想看我打的文字,可以直接拷走代码,自己声明上定义再略作修改就可以用了,不需做任何修改. -------------------------------小尾巴首次登场----------------------------------- SDI程序,是要缩放的,如果是往里输入文字的话,这倒没什么,但是这次我使用的是CFormView类,里面加了控件

asp.net重写server控件

新建一个server控件,然后让其继承button类,代码例如以下: using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Text; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace bt { [DefaultPrope

使用脚本操作UpdatePanel中控件的问题

假设有一个脚本(用js或者jQuery等类似手段编写),为UpdatePanel中的一个普通的TextBox赋值.如果你以为这样写: <head runat="server">     <title>Test</title>     <script src="Scripts/jquery-2.0.0.js"></script>     <script>         $(function ()

设置项目中控件的样式:webconfig中system.web下的Pages节点

关于system.web下面的Pages节点的详细说明,MSDN上面有,看这里. 这个Pages节点下的theme属性可以设置项目中控件的样式,直接引用skin文件来设置样式,不用在每个页面中添加,可以保证页面风格的一致性: <pages theme= "defaultTheme" /> 关于theme的添加: 创建主题完毕之后,在App_Themes文件夹下创建自己的样式,pages里面就可以直接使用了. 当然,如果要在某个页面中添加自定义的样式,可以在aspx中指定pa

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

form表单中控件较多,加载完成后点击都很慢,为什么?我一页面中form表单里面上百个控件(如input.select.radio.checkbox等),还有一些js脚本,加载速度还可以,都能全部显示完毕,但是点击一些事件(如切换tab.关闭模拟框,点击radio等)都非常慢,不知道为什么? 当我采用inprivate模式浏览时,以上动作都很快,但老用inprivate也麻烦,有何办法解决. 按理说form都在客户端显示完全了,其他操作都是客户端的操作阿应该不慢才对阿/. ------解决思路-

wxpython中控件对键盘输入无响应的可能原因

问题描述: 开发环境:Win7 32bit + Python2.7.6 + WxPython 3.0.1-b20140707 开发某初级CAD软件中,需要实现点击TreeCtrl控件的相应选择,实现GLCanvas窗口中三维空间点.线和面的添加和删除功能.对于点的添加有两种途径,再绑定TreeCtrl控件的事件后,先会弹出一个Dialog要求用户输入XYZ坐标,通过Apply按钮持续添加,或者OK按钮直接在GLCanvas窗口中鼠标拾取坐标添加,键盘e执行添加点,键盘q执行退出操作. 为此在GL