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

來源:互聯網
上載者:User
摘要:在上一講中,我們實現了應用程式基底本架構,其中有個小錯誤,在此先跟大家說明下。在“屬性”選項卡中,我們當時添加的是 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();

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.