ArcEngine 二次开发实习初级讲义
3.4 BaseCommand开发实例
在这一小节中,我们将学习BaseCommand的开发步骤。BaseCommand的功能与Button的功能类似,是当鼠标点击按钮的时候,MapControl控件会对其中的命令做出相应而无需额外的操作。在这一小节中,我们将制作一个“定比例尺放大”的按钮,当鼠标单击按钮时,地图将居中放大一倍。 3.4.1添加控件
如果上一小节的程序已经关闭,则重新打开,同时保证MapControl控件中加载了至少一个图层。在主窗体(frmMain)中添加一个Button,将其Text属性更改为“居中放大”。 3.4.2添加BaseCommand
点击菜单栏上的“项目”—>“添加类”,弹出以下对话框。
图44 添加新项对话框
如上图所示,在类别中选择ArcGIS项,在右侧的模板中选择“BaseCommand”项,并在名称中将其更改为“cmdFixedZoomIn”,点击添加,出现如下对话框。
- 36 -
ArcEngine 二次开发实习初级讲义
图45 类别选择向导
我们这个命令是用于MapControl控件的,所以在选择项中选择第二项,点击OK。 3.4.3添加代码
双击解决方案资源管理器中的cmdFixedZoomIn.vb项,进入该类的代码编写界面。首先按照前几节介绍过的方法,加入引用“ESRI.ArcGIS.Geometry”,并在该类的最上方添加如下代码:
Imports ESRI.ArcGIS.Geometry
如上图所示,将MyBase.m_toolTip和MyBase.m_name做相关修改,分别更改为“居中放大”和“cmdFixedZoomIn”。之后在OnClick()函数中添加如下代码:
Dim pEnvelope As IEnvelope
pEnvelope = frmMain.AxMapControl1.Extent
- 37 -
ArcEngine 二次开发实习初级讲义
pEnvelope.Expand(0.5, 0.5, True)
frmMain.AxMapControl1.Extent = pEnvelope
转到主窗体(frmMain),双击“居中放大”按钮,进入该按钮Click事件相应函数,添加如下代码:
Dim pcmdFixedZoomIn As New cmdFixedZoomIn pcmdFixedZoomIn.OnCreate(Me.AxMapControl1.Object)
pcmdFixedZoomIn.OnClick()
3.4.4 运行
运行程序,点击“居中放大”时,地图会放大一倍。点查询功能依然可用,如下图:
图46 程序运行结果
3.4.5 小结
在这一小节中,我们学习到了如何制作一个BaseCommand。使用BaseCommand的好处主要有,首先按照面向对象的思想,居中放大这个功能已经被封装在我们自己书写的类中,若是以后需要再将这个功能移植到别的程序,或者由多个程序员共同完成一个程序时,只需要将这个类复制到相关工程下,稍作调整即可运行;其次,我们可以发现,同样是实现放大功能,之前我们是直接在MapControl控件的OnMouseDown事件中添加代码,而现在是具体的写入到了每个类中。这样做可以是代码更易读,而且当需要完成许多不同的功能时,这种方法的优势就体现出来了,因为我们不需要再单独设立一个MouseFlag变量来判断具体用户点击了哪个按钮,MapControl的OnMouseDown事件中也无需再添加冗长的代码,而是分散到各类中,增强了程序的稳定性。
在新建cmdFixedZoomIn类的同时,我们发现还会附带生成一个cmdFixedZoomIn.bmp位图文件,您可以双击这个图标以做相关编辑更改工作,也可以用自己的图标来替换(注意保持文件名一致)。这个图标的作用,是在使用ToolbarControl的时候,用于显示按钮图标的。您可以尝试着在工程中加入一根ToolbarControl,并使用AddItem方法添加我们写好的这个类,看能否得到一样的结果。如果您对本小节的内容比较熟悉,也做了一些积极的尝试,那么您可以进入下一小节的学习。在下一小节中我们将学习BaseTool的开发方法。
3.5 BaseTool开发实例
经过上一小节的学习,我们了解到了如何自定义BaseCommand来拓展ArcGIS的应
- 38 -
ArcEngine 二次开发实习初级讲义
用。在这一小节中,我们将改写之前做过的点查询功能,将这项功能独立写成一个BaseTool。BaseTool与BaseCommand有些相似的地方,它们都是点击之后可以对MapControl控件做相应的操作,但是BaseCommand点击之后MapControl会直接予以相应,不需要额外的操作,而对于BaseTool来说,需要用户再用鼠标对地图做进一步交互式的操作,MapControl控件才会予以相应。例如在第二小节中制作的拉框放大功能,需要鼠标在地图上交互式的选取一个范围,地图才会予以相应,同样,我们这一小节要改写的点查询功能也是如此,需要您再在地图上单击鼠标才会予以响应。下面我们开始BaseTool的制作。 3.5.1 打开工程
我们这里需要在上一小节的基础上继续完善,如果您已经将MapView关闭,请重新打开,并保证MapControl中只加载了一个“states”图层,请务必注意这一步,这直接关系到您后面的工作能否顺利进行。 3.5.2 添加BaseTool
在菜单栏上选择“项目”——“添加类”,出现如下对话框:
图47 添加新项对话框
在类别中选中ArcGIS,在末班中选择BaseTool,并将名称更改为“toolPointQuery”,点击添加,出现如下对话框:
- 39 -
ArcEngine 二次开发实习初级讲义
图48 类别选择向导
我们这个工具是要用于MapControl,故选择第二项,点击OK。 3.5.3 添加引用和代码
双击解决方案资源管理器中的toolPointQuery.vb,进入该类的代码编写界面。 首先添加三个引用,如下图所示:
类似的,如下图所示,对MyBase.m_toolTip和MyBase.m_name做相关修改。
再在toolPointQuery.vb类中的OnMouseDown函数中添加如下代码:
Dim pFeatureLayer As IFeatureLayer
Dim pFeatureClass As IFeatureClass Dim pSpatialFilter As ISpatialFilter Dim pFilter As IQueryFilter Dim pActiveView As IActiveView Dim pPoint As IPoint Dim pBuffer As IGeometry Dim length As Double Dim n As Long
Dim pTopo As ITopologicalOperator Dim pCursor As IFeatureCursor Dim pFeature As IFeature
- 40 -