ArcGIS Engine+C# 初学者实例代码 下载本文

中的选择工具,你可以根据需要酌情添加工具。

5、编译运行

按F5即可编译运行程序,至此桌面GIS应用程序框架基本框架已经搭建好了,可以通过工具条的工具打开地图文档,浏览地图了,效果如开篇所示。

第二讲 菜单的添加及其实现

在上一讲中,我们实现了应用程序基本框架,其中有个小错误,在此先跟大家说明下。在“属性”选项卡中,我们当时添加的是DataGridView控件,这个控件是用来显示数据表的,而专门用于属性的查询和设置的控件是PropertyGrid控件。因此请你删除“属性”选项卡中的DataGridView控件,再把位于“工具箱|所有Windows窗体|PropertyGrid”(如果没有,右击选择“选择项”以添加此控件)控件拖到该选项卡。

在这一讲中,主要讲解菜单的添加和实现。

1、添加菜单

在设计视图中,单击菜单栏,会出现“请在此处键入”的提示,单击提示就可以键入菜单名称,如“文件”,再单击“文件”,即可输入其下拉子菜单,如下所示:

Tips:

每创建一个菜单,请在其属性面板中设置Name属性,而且不要为中文,因此Name值将是此菜单响应函数的函数名的一部分,带中文的函数名,总是不好吧。

本讲中,我们将添加新建(New)、打开(Open)、添加数据(AddData)、保存(Save)、另存为(SaveAs)、退出(Exit)这些菜单,()内为相应的Name属性值。

Tips:

你可以在属性面板中的Text属性中,把菜单名设置为中英文形式,如“打开 Open”,带下划线的O表示此项菜单的快捷键是字母O,设置方法是在相应字母前加上“&”字符,如“打开 &Open”。但这种快捷键只在打开此下拉菜单时才有效,

即当你单击“文件”菜单弹出下拉菜单时,按下字母O就可以定位到“打开”菜单。

还有一种在程序运行时都有效的全局快捷键,可以在属性面板中的“ShortCutKeys”中设置。

你还可以在属性面板中的Image属性中设置你喜欢的菜单图标。单击Image那一行右边的按钮,弹出如下菜单。选择“项目资源文件”,再单击导入就可以选择你的图标了。

最终效果如下所示。

注意,在解决方案面板中,选中刚才添加的所有图标,在其属性面板中将生成操作设置为“嵌入的资源”,这一点很重要!

2、实现相关菜单

首先定义指针(写在public partial class Form1 : Form下面即可): private ESRI.ArcGIS.Controls.IMapControl3 m_mapControl = null;

private ESRI.ArcGIS.Controls.IPageLayoutControl2 m_pageLayoutControl = null; private IMapDocument pMapDocument;

若以上指针无效,请添加以下引用:

using ESRI.ArcGIS.Carto; using ESRI.ArcGIS.Controls; using ESRI.ArcGIS.esriSystem; using ESRI.ArcGIS.Display; using ESRI.ArcGIS.Geometry; using ESRI.ArcGIS.SystemUI;

在设计视图中的属性面板中,选择Form1,即主窗体,单击事件按钮(闪电形状的那个按钮),打到“Load”事件并双击,添加此事件。

在Form1_Load函数中初始化这些指针:

//取得MapControl和PageLayoutControl的引用

m_mapControl = (IMapControl3)this.axMapControl1.Object;

m_pageLayoutControl = (IPageLayoutControl2)this.axPageLayoutControl1.Object;

依次双击每个菜单项,添加菜单响应函数。实现代码如下:

///

/// 新建地图命令 ///

///

private void New_Click(object sender, EventArgs e) { //本命令涉及到MapControl和PageLayoutControl同步问题,将在下一讲中实现 }

///

/// 打开地图文档Mxd命令 ///

private void Open_Click(object sender, EventArgs e) {

//本命令涉及到MapControl和PageLayoutControl同步问题,将在下一讲中实现 }

///

/// 添加数据命令 ///

private void AddData_Click(object sender, EventArgs e) {

int currentLayerCount = this.axMapControl1.LayerCount;

ICommand pCommand = new ControlsAddDataCommandClass(); pCommand.OnCreate(this.axMapControl1.Object); pCommand.OnClick(); }

///

/// 保存地图文档命令 ///

private void Save_Click(object sender, EventArgs e) {

//首先确认当前地图文档是否有效 if (null != m_pageLayoutControl.DocumentFilename m_mapControl.CheckMxFile(m_pageLayoutControl.DocumentFilename)) {

//创建一个新的地图文档实例

IMapDocument mapDoc = new MapDocumentClass(); //打开当前地图文档

mapDoc.Open(m_pageLayoutControl.DocumentFilename, string.Empty);

//用PageLayout中的文档替换当前文档中的PageLayout部分

mapDoc.ReplaceContents((IMxdContents)m_pageLayoutControl.PageLayout); //保存地图文档

mapDoc.Save(mapDoc.UsesRelativePaths, false); mapDoc.Close(); } }

///

/// 另存为地图文档命令 ///

private void SaveAs_Click(object sender, EventArgs e) {

//调用另存为命令

ICommand command = new ControlsSaveAsDocCommandClass(); command.OnCreate(m_controlsSynchronizer.ActiveControl); command.OnClick(); }

///

/// 退出程序 ///

private void Exit_Click(object sender, EventArgs e) {

Application.Exit(); }

&&

3、编译运行

按F5编译运行程序。也许你会发现,菜单命令的实现方式都是类型的。没错,在AE9.2中,内置了许多常用的Command和Tool,如ControlsAddDataCommandClass、ControlsMapZoomInToolClass、ControlsMapPanToolClass等等,这些内置对象在ESRI.ArcGIS.Controls命名空间中,你可以对象浏览器中查看。而且这些内置对象的调用方式都类似,如下所示: