中的选择工具,你可以根据需要酌情添加工具。
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命名空间中,你可以对象浏览器中查看。而且这些内置对象的调用方式都类似,如下所示: