《ArcGIS Engine+C#實例開發教程》第二講 菜單的添加及其實現

摘要:在上一講中,我們實現了應用程序基本框架,其中有個小錯誤,在此先跟大家說明下。在“屬性”選項卡中,我們當時添加的是 DataGridView 控件,這個控件是用來顯示數據表的,而專門用於屬性的查詢和設置的控件是 PropertyGrid 控件。因此請你刪除“屬性”選項卡中的 DataGridView 控件,再把位於“工具箱 | 所有 Windows 窗體 |PropertyGrid ”(如果沒有,右擊選擇“選擇項”以添加此控件)控件拖到該選項卡。

 教程目錄:

第一講 桌面GIS應用程序框架的建立

第二講 菜單的添加及其實現

第三講 MapControl與PageLayoutControl同步

第四講 狀態欄信息的添加與實現

第五講 鷹眼的實現

第六講 右鍵菜單添加與實現

教程Bug及優化方案1

第七講 圖層符號選擇器的實現1

第七講 圖層符號選擇器的實現2

第八講 屬性數據表的查詢顯示

------------------------------------------------------------------

在上一講中,我們實現了應用程序基本框架,其中有個小錯誤,在此先跟大家說明下。在“屬性”選項卡中,我們當時添加的是 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 命名空間中,你可以對象瀏覽器中查看。而且這些內置對象的調用方式都類似,如下所示:

 // 定義
ICommand command = new ControlsSaveAsDocCommandClass();
// 創建
command.OnCreate(m_controlsSynchronizer.ActiveControl);
// 調用
command.OnClick();

希望你可以舉一反三,去實現更多的你想要的功能。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章