ArcGIS Engine二次开发 - 基础篇 联系客服

发布时间 : 星期五 文章ArcGIS Engine二次开发 - 基础篇更新完毕开始阅读c1826921192e45361066f5ac

ArcGIS Engine二次开发——基础篇

图 12类别选择向导

我们这个命令是用于MapControl控件的,所以在选择项中选择“ArcMap,MapControl or PageLayoutControl Command”或者“MapControl or PageLayoutControl Command”,这里我们选择后者,点击OK。

1.4.3 添加代码

双击解决方案资源管理器中的FixedZoomIn.cs项,进入该类的代码编写界面。首先按照前几节介绍过的方法,加入引用“ESRI.ArcGIS.Geometry”,并在该类的最上方添加如下代码:

using ESRI.ArcGIS.Carto;

using ESRI.ArcGIS.Geometry;

将 base.m_caption、base.m_toolTip 更改为“居中放大”,将base.m_name 更改为“FixedZoomIn”。之后在OnClick()函数中添加如下代码:

public override void OnClick() {

// TODO: Add FixedZoomIn.OnClick implementation //获取当前视图范围

IActiveView pActiveView = m_hookHelper.ActiveView; IEnvelope pEnvelope = pActiveView.Extent; //扩大视图范围并刷新视图 pEnvelope.Expand(0.5, 0.5, true); pActiveView.Extent = pEnvelope; pActiveView.Refresh(); }

ArcGIS Engine二次开发——基础篇

转到主窗体(MapViewForm),双击“居中放大”按钮,进入该按钮Click事件相应函数,添加如下代码:

private void btnZoomIn_Click(object sender, EventArgs e) {

//声明与初始化

FixedZoomIn fixedZoomin = new FixedZoomIn(); //与MapControl关联

fixedZoomin.OnCreate(this.axMapControl1.Object); fixedZoomin.OnClick();

}

1.4.4 运行

运行程序,点击“居中放大”时,地图会放大一倍。点查询功能依然可用,如下图:

图 13程序运行结果

1.4.5 小结

在这一小节中,我们学习到了如何制作一个BaseCommand。使用BaseCommand的好处主要有,首先按照面向对象的思想,居中放大这个功能已经被封装在我们自己书写的类中,若是以后需要再将这个功能移植到别的程序,或者由多个程序员共同完成一个程序时,只需要将这个类复制到相关工程下,稍作调整即可运行;其次,这样做可以是代码更易读,而且当需要完成许多不同的功能时,这种方法的优势就体现出来了,因为我们不需要再单独设立一个MouseFlag变量来判断具体用户点击了哪个按钮,MapControl的OnMouseDown事件中也无需再添加冗长的代码,而是分散到各类中,增强了程序的稳定性。在新建FixedZoomIn类的同时,我们发现还会附带生成一个FixedZoomIn.bmp位图文件,您可以双击这个图标以

ArcGIS Engine二次开发——基础篇

做相关编辑更改工作,也可以用自己的图标来替换(注意保持文件名一致)。这个图标的作用,是在使用ToolbarControl的时候,用于显示按钮图标的。您可以尝试着在工程中加入一根ToolbarControl,并使用AddItem方法添加我们写好的这个类,看能否得到一样的结果。

使用ArcEngine自带BaseCommand基类,可以方便的开发出相关的Command按钮,从这个实例我们可以看出,根据Command按钮随鼠标点击MapControl及时响应的特性,我们一般只需要重载BaseCommand 的OnClick()函数即可。然后在功能的实现处首先调用OnCreate()函数实现与MapControl的关联,调用OnClick()函数实现功能响应。这样有效的提高了我们进行功能开发的效率。

其实,对于一些基本的地图操作Command的功能,ArcEngine进行了完整的封装,我们在使用时可以直接使用ArcEngine的封装类进行实例化。仍以“固定比例尺放大”为例,我们可以在“居中放大”按钮的Click事件中直接使用ArcEngine的封装类实现(注意,在这个示例中需要添加“ESRI.ArcGIS.SystemUI”和“ESRI.ArcGIS.Controls”的引用),代码如下:

ICommand command = new ControlsMapZoomInFixedCommandClass(); command.OnCreate(this.axMapControl1.Object);

command.OnClick();

这种方法比我们基于BaseCommand的开发方法更加简便,我们在此介绍的目的是为了让大家掌握这种基本的开发方法,方便用于其他Command功能的开发。如果您对本小节的内容比较熟悉,也做了一些积极的尝试,那么您可以进入下一小节的学习。在下一小节中我们将学习BaseTool的开发方法。

1.5 BaseTool开发实例

经过上一小节的学习,我们了解到了如何自定义BaseCommand来拓展ArcGIS的应用。我们将学习基于BaseTool的自定义功能开发,BaseTool与BaseCommand有些相似的地方,它们都是点击之后可以对MapControl控件做相应的操作,但是BaseCommand点击之后MapControl会直接予以相应,不需要额外的操作,而对于BaseTool来说,点击该功能之后,只是开启一个交互的过程,需要用户再用鼠标、键盘等对地图做进一步交互式的操作,MapControl控件才会予以相应,如ArcMap中的放大ZoomIn、漫游Pan等。

为了实现BaseTool与BaseCommand功能实现的差异,在这一小节中,我们将剖析ArcMap的放大(ZoomIn)功能,并利用BaseTool进行实现。

1.5.1 打开工程

我们这里需要在上一小节的基础上继续完善,如果您已经将MapView关闭,请重新打开。在主窗体(MapViewForm)中添加一个Button,将其Name属性改为btnZoomIn,Text属性更改为“拉框放大”。

3.5.2 添加BaseTool

在菜单栏上选择“项目”——“添加类”,出现如下对话框:

ArcGIS Engine二次开发——基础篇

图 14添加新项对话框

在类别中选中ArcGIS,在模板中选择BaseTool,并将名称更改为“ZoomIn”,点击添加,出现如下对话框:

图 38类别选择向导

我们这个工具是要用于MapControl,仍选择“MapControl or PageLayoutControl Command”,点击OK。

1.5.2 添加代码

双击解决方案资源管理器中的 ZoomIn.cs,进入该类的代码编写界面。

首先添加ESRI.ArcGIS.Carto、ESRI.ArcGIS.Geodatabase、ESRI.ArcGIS.Geometry、ESRI.ArcGIS..Display四个引用,类似的,将 base.m_caption、base.m_toolTip 更改为“拉框