}
//调用另存为命令
ICommand command = new ControlsSaveAsDocCommandClass(); command.OnCreate(m_controlsSynchronizer.ActiveControl); command.OnClick(); }
在切换视图时,我们要激活相关的视图,故在设计视图的属性面板中选择tabControl2控件,再选择事件按钮,找到“SelectedIndexChanged”事件双击添加之。其实现代码如下所示:
///
/// 切换地图和制版视图 ///
///
private void tabControl2_SelectedIndexChanged(object sender, EventArgs e) {
if (this.tabControl2.SelectedIndex == 0) {
//激活MapControl
m_controlsSynchronizer.ActivateMap(); } else {
//激活PageLayoutControl
m_controlsSynchronizer.ActivatePageLayout(); } }
5、编译运行
按F5编译运行程序,至此我们完成了MapControl和PageLayoutControl两种视图的同步工作。 在下一讲中,我将给大家带来的是状态栏的相关操作,敬请关注3SDN.NET。
《ArcGIS Engine+C#实例开发教程》第四讲 状态栏信息的添加与实现
在上一讲中,我们完成了 MapControl 和 PageLayoutControl 两种视图的同步工作,本讲我们将完成状态栏信息的添加与实现。
应用程序的状态栏一般用来显示程序的当前状态,当前所使用的工具。 GIS 应用程序一般也在状态栏显示当前光标的坐标、比例尺等信息。
学习完本讲内容,您将学会状态栏编程的基本方法,并且能够在我们的程序的状态栏中添加且显示以下信息:
当前所用工具信息 当前比例尺 当前坐标
1、 添加状态栏项目
在设计视图中,点击窗体中的状态栏,在其属性面板中找到“ Items ”项,单击其右边的按钮,在下拉框中选择“ StatusLabel ”,单击“添加按钮”,依次添加四个 StatusLabel ,依次修改属性参数如下表所示: 序号 1 2 3 4 Name 属性 MessageLabel Blank ScaleLabel CoordinateLabel Text 属性 就绪 比例尺 当前坐标 Spring 属性 False True False False 说明 当前所用工具信息 占位 当前比例尺 当前坐标 设置好之后如下图所示:
Tips :
我们设计出的状态栏最终如下所示: 就绪 ( Blank ) 比例尺 当前坐标 Spring 属性表示可以按状态栏剩余空间自动伸缩。所以加入 Blank 项目,只是为了占个位子,以达到 ScaleLabel 和 CoordinateLabel 项目右对齐而 MessageLabel 项目左对齐的目的。
2、 显示当前所用工具信息
首先添加 axToolbarControl1 的 OnMouseMove 事件 ( 相信大家看了以上的教程,已经知道怎么添加事件了吧,还不知道的建议再温习下前几讲的内容 ) 。在其事件响应函数代码如下:
private void axToolbarControl1_OnMouseMove(object sender, IToolbarControlEvents_OnMouseMoveEvent e) {
// 取得鼠标所在工具的索引号
int index = axToolbarControl1.HitTest(e.x, e.y, false);
if (index != -1) {
// 取得鼠标所在工具的 ToolbarItem
IToolbarItem toolbarItem = axToolbarControl1.GetItem(index);
// 设置状态栏信息
MessageLabel.Text = toolbarItem.Command.Message; }
else {
MessageLabel.Text = \就绪 \ } }
3、 显示当前比例尺
添加 axMapControl1 的 OnMouseMove 事件,其代码如下:
private void axMapControl1_OnMouseMove(object sender, IMapControlEvents2_OnMouseMoveEvent e) {
// 显示当前比例尺
ScaleLabel.Text = \比例尺 1:\ }
4、 显示当前坐标
显示当前坐标也是 axMapControl1 的 OnMouseMove 事件中响应,故只要在 axMapControl1_OnMouseMove 函数中添加如下代码即可:
// 显示当前坐标
CoordinateLabel.Text = \当前坐标 X = \+ e.mapX.ToString() + \Y = \+ e.mapY.ToString() + \\+ this.axMapControl1.MapUnits;
按 F5 编译运行,可以看到,我们的程序已经能够正常工作了。但是细心的你可能会发现,当前坐标的后面的坐标单位为“ esriUnknownUnits ”或“ esriMeters ”之类,即系统在正常单位的前面加上了“ esri ”,追求完美的我们自然看得不舒服。那就进行简单的替换吧。
首先定义个全局坐标单位变量 sMapUnits ,如下所示:
private string sMapUnits;
再 Form1_Load 函数中进行初始化:
sMapUnits = \
添加 axMapControl1 控件的 OnMapReplaced 事件,在事件响应函数中进行坐标单位替换,代码如下:
private void axMapControl1_OnMapReplaced(object sender, IMapControlEvents2_OnMapReplacedEvent e) {
esriUnits mapUnits = axMapControl1.MapUnits;
switch (mapUnits) {
case esriUnits.esriCentimeters:
sMapUnits = \
break;
case esriUnits.esriDecimalDegrees:
sMapUnits = \
break;
case esriUnits.esriDecimeters:
sMapUnits = \
break;
case esriUnits.esriFeet:
sMapUnits = \
break;
case esriUnits.esriInches:
sMapUnits = \
break;
case esriUnits.esriKilometers:
sMapUnits = \
break;
case esriUnits.esriMeters:
sMapUnits = \
break;
case esriUnits.esriMiles:
sMapUnits = \
break;
case esriUnits.esriMillimeters:
sMapUnits = \
break;
case esriUnits.esriNauticalMiles:
sMapUnits = \
break;
case esriUnits.esriPoints:
sMapUnits = \
break;
case esriUnits.esriUnknownUnits:
sMapUnits = \
break;
case esriUnits.esriYards: