教程目錄:
第三講 MapControl與PageLayoutControl同步
第八講 屬性數據表的查詢顯示
------------------------------------------------------------------
在上一講中,我們實現了應用程序基本框架,其中有個小錯誤,在此先跟大家說明下。在“屬性”選項卡中,我們當時添加的是 DataGridView 控件,這個控件是用來顯示數據表的,而專門用於屬性的查詢和設置的控件是 PropertyGrid 控件。因此請你刪除“屬性”選項卡中的 DataGridView 控件,再把位於“工具箱 | 所有 Windows 窗體 |PropertyGrid ”(如果沒有,右擊選擇“選擇項”以添加此控件)控件拖到該選項卡。
在這一講中,主要講解菜單的添加和實現。
1、 添加菜單
在設計視圖中,單擊菜單欄,會出現“請在此處鍵入”的提示,單擊提示就可以鍵入菜單名稱,如“文件”,再單擊“文件”,即可輸入其下拉子菜單,如下所示:
Tips :
每創建一個菜單,請在其屬性面板中設置 Name 屬性,而且不要爲中文,因此 Name 值將是此菜單響應函數的函數名的一部分,帶中文的函數名,總是不好吧。
本講中,我們將添加新建( New )、打開( Open )、添加數據( AddData )、保存( Save )、另存爲( SaveAs )、退出( Exit )這些菜單,()內爲相應的 Name 屬性值。
Tips:
你可以在屬性面板中的 Text 屬性中,把菜單名設置爲中英文形式,如“打開 O pen ”,帶下劃線的 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; |
依次雙擊每個菜單項,添加菜單響應函數。實現代碼如下:
/// <summary> /// 新建地圖命令 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void New_Click(object sender, EventArgs e) { // 本命令涉及到 MapControl 和 PageLayoutControl 同步問題,將在下一講中實現 } /// <summary> /// 打開地圖文檔 Mxd 命令 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void Open_Click(object sender, EventArgs e) { // 本命令涉及到 MapControl 和 PageLayoutControl 同步問題,將在下一講中實現 } /// <summary> /// 添加數據命令 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void AddData_Click(object sender, EventArgs e) { int currentLayerCount = this.axMapControl1.LayerCount; ICommand pCommand = new ControlsAddDataCommandClass(); pCommand.OnCreate(this.axMapControl1.Object); pCommand.OnClick(); } /// <summary> /// 保存地圖文檔命令 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> 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(); } } /// <summary> /// 另存爲地圖文檔命令 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void SaveAs_Click(object sender, EventArgs e) { // 調用另存爲命令 ICommand command = new ControlsSaveAsDocCommandClass(); command.OnCreate(m_controlsSynchronizer.ActiveControl); command.OnClick(); } /// <summary> /// 退出程序 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void Exit_Click(object sender, EventArgs e) { Application.Exit(); } |
3、 編譯運行
按 F5 編譯運行程序。也許你會發現,菜單命令的實現方式都是類型的。沒錯,在 AE9.2 中,內置了許多常用的 Command 和 Tool ,如 ControlsAddDataCommandClass 、 ControlsMapZoomInToolClass 、 ControlsMapPanToolClass 等等,這些內置對象在 ESRI.ArcGIS.Controls 命名空間中,你可以對象瀏覽器中查看。而且這些內置對象的調用方式都類似,如下所示:
// 定義 |
希望你可以舉一反三,去實現更多的你想要的功能。