摘要:在上一講中,我們完成了 MapControl 和PageLayoutControl兩種視圖的同步工作,本講我們將完成狀態列資訊的添加與實現。應用程式的狀態列一般用來顯示程式的目前狀態,當前所使用的工具。 GIS應用程式一般也在狀態列顯示當前游標的座標、比例尺等資訊。學習完本講內容,您將學會狀態列編程的基本方法,並且能夠在我們的程式的狀態列中添加且顯示以下資訊:當前所用工具資訊、當前比例尺、當前座標。
教程目錄:
第一講 案頭GIS應用程式架構的建立
第二講 菜單的添加及其實現
第三講 MapControl與PageLayoutControl同步
第四講 狀態列資訊的添加與實現
第五講 鷹眼的實現
第六講 右鍵菜單添加與實現
教程Bug及最佳化方案1
第七講 圖層符號選取器的實現1
第七講 圖層符號選取器的實現2
第八講 屬性資料表的查詢顯示
------------------------------------------------------------------
在上一講中,我們完成了 MapControl 和 PageLayoutControl 兩種視圖的同步工作,本講我們將完成狀態列資訊的添加與實現。
應用程式的狀態列一般用來顯示程式的目前狀態,當前所使用的工具。 GIS 應用程式一般也在狀態列顯示當前游標的座標、比例尺等資訊。
學習完本講內容,您將學會狀態列編程的基本方法,並且能夠在我們的程式的狀態列中添加且顯示以下資訊:
1、 添加狀態列項目
在設計檢視中,點擊表單中的狀態列,在其屬性面板中找到“ Items ”項,單擊其右邊的按鈕,在下拉框中選擇“ StatusLabel ”,單擊“添加按鈕”,依次添加四個 StatusLabel ,依次修改屬性參數如下表所示:
序號 |
Name 屬性 |
Text 屬性 |
Spring 屬性 |
說明 |
1 |
MessageLabel |
就緒 |
False |
當前所用工具資訊 |
2 |
Blank |
|
True |
佔位 |
3 |
ScaleLabel |
比例尺 |
False |
當前比例尺 |
4 |
CoordinateLabel |
當前座標 |
False |
當前座標 |
設定好之後如所示:
Tips :
我們設計出的狀態列最終如下所示:
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:" + ((long)this.axMapControl1.MapScale).ToString(); } |
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 函數中進行初始化:
添加 axMapControl1 控制項的 OnMapReplaced 事件,在事件響應函數中進行座標單位替換,代碼如下:
private void axMapControl1_OnMapReplaced(object sender, IMapControlEvents2_OnMapReplacedEvent e) { esriUnits mapUnits = axMapControl1.MapUnits; switch (mapUnits) { case esriUnits.esriCentimeters: sMapUnits = "Centimeters"; break; case esriUnits.esriDecimalDegrees: sMapUnits = "Decimal Degrees"; break; case esriUnits.esriDecimeters: sMapUnits = "Decimeters"; break; case esriUnits.esriFeet: sMapUnits = "Feet"; break; case esriUnits.esriInches: sMapUnits = "Inches"; break; case esriUnits.esriKilometers: sMapUnits = "Kilometers"; break; case esriUnits.esriMeters: sMapUnits = "Meters"; break; case esriUnits.esriMiles: sMapUnits = "Miles"; break; case esriUnits.esriMillimeters: sMapUnits = "Millimeters"; break; case esriUnits.esriNauticalMiles: sMapUnits = "NauticalMiles"; break; case esriUnits.esriPoints: sMapUnits = "Points"; break; case esriUnits.esriUnknownUnits: sMapUnits = "Unknown"; break; case esriUnits.esriYards: sMapUnits = "Yards"; break; } } |
5、 編譯運行
按 F5 編譯運行程式。如果你足夠細心的話,相信你已經成功了!
在本講中,介紹中 StatusStrip 控制項的基本使用方法和 AE 中當所用工具資訊、當前比例尺和當前座標的顯示調用方法。