1. 程式人生 > >C#,ArcGIS Engine開發入門教程

C#,ArcGIS Engine開發入門教程

利用ArcGIS EngineVS .NETWindows控制元件開發GIS應用

Dixon整理

此過程說明適合那些使用.NET建立和部署應用的開發者,它描述了使用ArcGIS控制元件建立和部署應用的方法和步驟。

你可以在下面的目錄下找到相應的樣例程式:

<安裝目錄>/DeveloperKit/Samples/Developer_Guide_Scenarios/ ArcGIS_Engine/Building_an_ArcGIS_Control_Application/Map_Viewer

注:ArcGIS樣例程式不包含在ArcGIS Engine開發工具包“典型”安裝方式中。如果你沒有安裝它們,則可以重新執行開發工具包安裝嚮導,選擇“定製”或“修改”方式,並選擇軟體開發包下的樣例項進行安裝。

一、專案描述

利用視窗控制元件建立應用程式的目標是演示並使你熟悉在微軟Visual Studio .NET API中使用標準ArcGIS控制元件開發和部署GIS應用所需的步聚。本節中使用了Visual Studio .NET開發環境中的MapControl PageLayoutControlTOCControlToolbarControl等視窗控制元件。COMJavaC++程式設計師應該參考如下章節:。

本節演示了建立檢視ArcMapArcGIS桌面應用圖形文件的GIS應用程式的步驟。此節包含了以下技術:

l在微軟Visual Studio .NET中載入和嵌入ArcGIS控制元件。

l向PageLayoutControlMapControl中載入圖形文件。

l設定ToolbarControlTOCControl的繫結控制元件。

l處理視窗縮放。

l向ToolbarControl新增ArcGIS Engine命令和工具。

l建立彈出式選單

l在TOCControl中管理標籤編輯

l在MapControl中繪製圖形。

l為MapControlPageLayoutControlToolbarControl建立定製工具。

l使用者化ToolbarControl

l在Windows作業系統中部署應用。

二、概述

本方案使用微軟Visual Studio .NET開發環境加以實現,並使用了ESRI interop

程式集(Interop Assemblies),它服務於被放置在.NET窗體上的、位於.NET 窗體控制元件(.NET Windows Controls)中的ArcGIS控制元件,這些程式集在託管的.NET程式碼和非託管的COM程式碼之間起了橋樑作用。對COM ArcGIS控制元件(COM ArcGIS Controls)成員的引用都要經過Interop程式集,然後到達實際的COM物件。同樣,也從COM物件經過Interop程式集到達.NET應用程式。每個ArcGIS Engine控制元件具有方法、屬性與事件,它們能夠被控制元件嵌入的容器(如,.NET窗體)訪問。每個控制元件物件及其功能可以與其他ESRI ArcObjects和自定義控制元件組合使用,建立使用者化的客戶應用程式。

此方案是使用了C#Visual Basic .NET兩種語言建立,但以下技術實現集中傾向於C#方案。許多開發者可能會感覺用Visual Basic .NET更舒服,那是因為他們已經比較熟悉Visual Basic 6.0程式碼,然而,對於JavaC++程式設計師來說,他們將會覺得對C#程式語言的語法更熟悉。無論你使用哪種開發環境,對於使用ArcGIS控制元件的好壞既依賴於你的程式設計環境技術,也依賴於你所掌握的ArcObjects技術。

在本方案中,使用ToolbarControlTOCControlPageLayoutControlMapControl來為應用程式提供使用者介面。這些ArcGIS控制元件與其他ArcObjectsArcGIS Engine命令被開發者一起使用,用來建立一個GIS視窗應用。

三、設計

此方案在設計時,首先強調了ArcGIS 控制元件如何互相之間進行互動,其次,向開發者解釋說明了ArcGIS 控制元件物件模型的一部分。

每個.NET ArcGIS Engine控制元件包含有一套能夠被嵌入其內的視窗即時訪問的屬性頁。這些屬性些為控制元件屬性和方法的選擇提供了捷徑,並且允許開發者不寫任何程式碼即可建立一個應用程式。本方案並沒有使用屬性頁,而是採用寫程式碼的方式建立應用程式。關於屬性頁的更進一步的資訊,請參考ArcGIS開發幫助(ArcGIS Developer Help)

四、條件需求

要順利地完成以下方案,你需要以下條件(對於部署的需求將在後續的部署章節涉及到):

l安裝具有授權檔案的ArcGIS Engine開發工具包(Developer Kit),使之能夠用於開發。

l安裝有微軟Visual Studio .NET 2003開發環境和微軟.NET Framework 1.1及其相應協議。

l熟悉微軟Windows作業系統和Microsoft Visual Studio .NET的工作知識,會用C#Visual Basic .NET程式語言。當然,此方案中提供了一些如何在Microsoft Visual Studio .NET中使用ArcGIS控制元件的資訊,但它不能替代對開發環境的培訓。

l不需要對ESRI其它軟體有足夠的經驗,但如果以前對ArcObjects有所接觸並對ArcGIS應用(如,ArcCatalogArcMap)有一個基本瞭解,則對於開發更有利。

l訪問來自本方案的樣例資料和程式碼,它位於:

<安裝目錄>/DeveloperKit/Samples/Developer_Guide_Scenarios/ ArcGIS_Engine/Building_an_ArcGIS_Control_Application/Map_Viewer

本方案中使用到的控制元件和庫如下:

lAxMapControl

lAxTOCControl

lAxPageLayoutControl

lAxToolbarControl

lESRI.ArcGIS.Carto

lESRI.ArcGIS.System

lESRI.ArcGIS.Display

lESRI.ArcGIS.SystemUI

lESRI.ArcGIS.Geometry

lESRI.ArcGIS.Utility

lesriMapControl

lesriTOCControl

lesriPageLayoutControl

lesriToolbarControl

五、實現

下面的實現過程中提供了你成功完成方案所需所有程式碼。假設你對於開發環境已經有了一定的知識,所以下面沒有逐步地詳細介紹如何用Microsoft Visual Studio .NET開發應用。

(一) 載入ArcGIS控制元件

在你為應用程式編寫程式碼之前,應該先將應用程式將用到的ArcGIS控制元件和其他ArcGIS Engine庫引用裝載到開發環境之中。

1.     啟動Visual Studio .NET,並從新建專案對話方塊中建立一個新的Visual C# Windows應用程式”專案。

2.     將專案命名為“Controls”,並選擇位置存取該專案。

3.     在“工具箱”的“Windows窗體”標籤欄中單擊右鍵,然後從上下文選單中選擇“新增/移除項(I)…”。

4.     在“自定義工具箱”中選擇“.NET Framework元件”,並複選“AxMapControl”,“AxPageLayoutControl”,“AxTOCControl”和“AxToolbarControl”,單擊確定按鈕。這樣所選擇的控制元件將顯示在工具箱Windows窗體標籤欄中。

5.     單擊專案選單,並選擇“新增引用(R)…”。

6.     新增引用對話方塊中,雙擊“ESRI.ArcGIS.Carto”,“ESRI.ArcGIS.Display”,“ESRI.ArcGIS.Geometry”,“ESRI.ArcGIS.System”,“ESRI.ArcGIS.SystemUI”,“ESRI.ArcGIS.Utility”。單擊確定

注:對於ESRI .NET程式集,將通過具體例項來說明,並使用.NET框架提供的COM傳送服務從你的C#專案中呼叫ESRI物件庫中的實體物件。

(二) 在容器中嵌入ArcGIS控制元件

在你能夠訪問每個控制元件的事件、屬性和方法之前,需要將控制元件嵌入到.NET容器中。一旦將控制元件嵌入窗體內,它們將圖形化應用程式的使用者介面。

1.       在設計模式下開啟.NET窗體。

2.       雙擊工具箱Windows標籤欄中的AxMapControl控制元件,將MapControl加入到窗體上。

3.       再將AxPageLayoutControlAxTOCControlAxToolbarControl如上新增到窗體中。

4.       重新調整窗體上各個控制元件的大小和位置,調整結果如下所示。

5.       在窗體上雙擊顯示窗體程式碼視窗,在程式碼視窗的頂部增加“using”命令:

using System;

using System.Windows.Forms;

// ArcGIS Engine引用

using ESRI.ArcGIS.SystemUI;

using ESRI.ArcGIS.Carto;

using ESRI.ArcGIS.Display;

using ESRI.ArcGIS.Geometry;

using ESRI.ArcGIS.esriSystem;

using ESRI.ArcGIS.ToolbarControl;

using ESRI.ArcGIS.TOCControl;

注:需注意C#是區分大小寫的。當你鍵入“ESRI.”時,智慧敏感的自動完成功能將允許你通過按Tab鍵完成下一節。

(三) 載入Map文件到MapControl與PageLayoutControl

單獨的資料層或者使用ArcMapArcGIS桌面應用程式產生的圖形文件,能夠被載入到MapControlPageLayoutControl中。你可以載入樣例圖形文件,或者載入你自己的圖形文件。後面你將增加一個瀏覽圖形文件的對話方塊。

1.       選擇Form_Load事件,並輸入下列程式碼(如果你使用你自己的圖形文件,要替換為正確的檔名):

     // 使用相對路徑向PageLayoutControl載入一個圖形文件

     string filename = @"../../../../../../../../Data//ArcGIS_Engine_Developer_Guide//gulf of st. lawrence.mxd";

     if ( axPageLayoutControl1.CheckMxFile(filename) )

     {

         axPageLayoutControl1.LoadMxFile(filename, "");

     }

2.       在設計模式顯示窗體並從屬性窗選擇axPageLayoutControl1控制元件,顯示axPageLayoutControl事件。在OnPageLayoutReplaced事件上雙擊向程式碼視窗新增該事件的處理函式。

3.axPageLayoutControl1_OnPageLayoutReplaced事件中鍵入以下向MapControl載入樣例圖形文件的程式碼。當文件被裝載入PageLayoutControl時OnPageLayoutReplaced事件將會被觸發。

     private void axPageLayoutControl1_OnPageLayoutReplaced(object sender, ESRI.ArcGIS.PageLayoutControl.IPageLayoutControlEvents_OnPageLayoutReplacedEvent e)

     {

         // 載入同樣的文件到MapControl

         axMapControl1.LoadMxFile(axPageLayoutControl1.DocumentFilename, nullnull);

         // 設定MapControl顯示範圍至資料的全域性範圍

         axMapControl1.Extent = axMapControl1.FullExtent;

}

(四) 設定ToolbarControl與TOCControl控制元件的繫結控制元件

對於此應用程式,TOCControlToolbarControl控制元件將與PageLayoutControl相互協作,而不是MapControl為此PageLayoutControl必須設定為繫結控制元件TOCControl使用繫結的ActiveView顯示圖形、圖層和符號。而位於ToolbarControl上的任何命令、工具或選單項會受繫結控制元件的顯示影響。

1.       Form_Load事件中的載入文件程式碼的後面鍵入以下紅色部分內容:

     private void Form1_Load(object sender, System.EventArgs e)

     {

         // 使用相對路徑向PageLayoutControl載入一個圖形文件

         string filename = @"../../../../../../../../Data//ArcGIS_Engine_Developer_Guide//gulf of st. lawrence.mxd";

         if ( axPageLayoutControl1.CheckMxFile(filename) )

         {

             axPageLayoutControl1.LoadMxFile(filename, "");

         }

         // 設定繫結控制元件

         axTOCControl1.SetBuddyControl(axPageLayoutControl1);

         axToolbarControl1.SetBuddyControl(axPageLayoutControl1);

}

2.       生成並執行應用程式。圖形文件被載入到PageLayoutControl,並且TOCControl列出了圖形文件中的資料圖層。使用TOCControl通過複選和取消複選框控制圖層的可見性。預設地,圖形文件的焦點圖(focus map)被裝入MapControl控制元件。在這種當前情況下,ToolbarControl控制元件顯示是空的,因為沒有為它新增任何命令。試著縮放窗體,你會注意到控制元件不會改變尺寸。

(五) 處理視窗縮放

當視窗在執行時進行縮放時,PageLayoutControlMapControl不會自動改變自身的尺寸。要改變控制元件的尺寸以便它們總是與匹配視窗的範圍,你必須將控制元件錨定在視窗上。如果PageLayoutControlMapControl包含大量的資料,在視窗縮放期間重繪這些資料顯得相當重要。為了提高執行效率,你可以禁止資料重繪直到縮放操作完成後再重繪之。在縮放時,可以用一個可伸縮的點陣圖來替代重繪資料。

1.       在設計模式顯示窗體並從屬性視窗中選擇axPageLayoutControl1。單擊Anchor屬性,將axPageLayoutControl1錨定在窗體的頂、左、底和右部。

2.       錨定axMapControl控制元件到窗體的頂、左和底部。

3.       Form_Load事件的開頭增加以下程式碼:

// 當縮放時禁止重繪

this.SetStyle(ControlStyles.EnableNotifyMessage, true);

4.       向類增加以下常量:

        public class Form1 : System.Windows.Forms.Form

     {

         // ……

         private const int WM_ENTERSIZEMOVE = 0x231;

private const int WM_EXITSIZEMOVE = 0x232;

  // ……

}

5.       向過載的OnNotifyMessage方法中增加下列程式碼:

     protected override void OnNotifyMessage(Message m)

     {

         base.OnNotifyMessage (m);

         // 以下為手工新增的程式碼

         if ( m.Msg == WM_ENTERSIZEMOVE)

         {

             axMapControl1.SuppressResizeDrawing(true, 0);

             axPageLayoutControl1.SuppressResizeDrawing(true, 0);

         }

         else if ( m.Msg == WM_EXITSIZEMOVE)

         {

             axMapControl1.SuppressResizeDrawing(false, 0);

             axPageLayoutControl1.SuppressResizeDrawing(false, 0);

         }

}

6.       生成並執行應用程式,試著縮放視窗。

注:禁止縮放時重畫方法是通過檢查傳送到窗體的Windows訊息工作的。當視窗開發縮放時,Windows傳送WM_ENTERSIZEMOVE視窗訊息。此時,我們禁止在MapControl和PageLayoutControl上繪製圖形,而是使用“stretchy bitmap”繪製。當Windows傳送WM_EXITSIZEMOVE訊息時,窗體結束縮放,這時我們全部重繪新的範圍。

(六) 向ToolbarControl增加命令

ArcGIS Engine提供了120多個命令和工具,它們與MapControlPageLayoutControlToolbarControl直接相互協作。這些命令和工具為你提供了大量的經常使用的地圖導航、圖形管理、地物選擇等方面的GIS功能。現在將在你的應用程式中增加這些命令和工具的一部分。

1.       Form_Load事件中的載入文件程式碼之前新增如下程式碼。

         // 增加開啟檔命令

         string progID;

         progID = "esriControlToolsGeneric.ControlsOpenDocCommand";

         axToolbarControl1.AddItem(progID, -1, -1, false, 0,

             esriCommandStyles.esriCommandStyleIconOnly);

         // 增加PageLayout導航命令

         progID = "esriControlToolsPageLayout.ControlsPageZoomInTool";

         axToolbarControl1.AddItem(progID, -1, -1, true, 0,

             esriCommandStyles.esriCommandStyleIconOnly);

         progID = "esriControlToolsPageLayout.ControlsPageZoomOutTool";

         axToolbarControl1.AddItem(progID, -1, -1, true, 0,

             esriCommandStyles.esriCommandStyleIconOnly);

         progID = "esriControlToolsPageLayout.ControlsPagePanTool";

         axToolbarControl1.AddItem(progID, -1, -1, true, 0,

             esriCommandStyles.esriCommandStyleIconOnly);

         progID = "esriControlToolsPageLayout.ControlsPageZoomWholePageCommand";

         axToolbarControl1.AddItem(progID, -1, -1, true, 0,

             esriCommandStyles.esriCommandStyleIconOnly);

         progID = "esriControlToolsPageLayout.ControlsPageZoomPageToLastExtentBackCommand";

         axToolbarControl1.AddItem(progID, -1, -1, true, 0,

             esriCommandStyles.esriCommandStyleIconOnly);

         progID = "esriControlToolsPageLayout.ControlsPageZoomPageToLastExtentForwardCommand";

         axToolbarControl1.AddItem(progID, -1, -1, true, 0,

             esriCommandStyles.esriCommandStyleIconOnly);

         // 增加地圖導航命令

         progID = "esriControlToolsMapNavigation.ControlsMapZoomInTool";

         axToolbarControl1.AddItem(progID, -1, -1, true, 0,

             esriCommandStyles.esriCommandStyleIconOnly);

         progID = "esriControlToolsMapNavigation.ControlsMapZoomOutTool";

         axToolbarControl1.AddItem(progID, -1, -1, true, 0,

             esriCommandStyles.esriCommandStyleIconOnly);

         progID = "esriControlToolsMapNavigation.ControlsMapPanTool";

         axToolbarControl1.AddItem(progID, -1, -1, true, 0,

             esriCommandStyles.esriCommandStyleIconOnly);

         progID = "esriControlToolsMapNavigation.ControlsMapFullExtentCommand";

         axToolbarControl1.AddItem(progID, -1, -1, true, 0,

             esriCommandStyles.esriCommandStyleIconOnly);

// 使用相對路徑向PageLayoutControl載入一個圖形文件

// ……

2.       生成並執行應用程式。現在ToolbarControl包含了ArcGIS Engine命令和工具,你可以使用它們導航載入到PageLayoutControl中的圖形文件。使用頁面佈局命令對當前的頁面佈局進行導航控制,要對存在於資料框架中的資料進行導航則使用地圖命令。利用找開文件命令可以瀏覽並載入其他的圖形文件。

(七) 給PageLayoutControl新增彈出式選單

與給跟繫結控制元件協作的ToolbarControl增加ArcGIS Engine命令一樣,按照前面的步驟,你也可以從ArcGIS Engine命令建立彈出式選單。下面將向你的應用程式中增加與PageLayoutControl協作的彈出式選單。當在PageLayoutControl可視區域點選滑鼠右鍵的時候,彈出式選單將顯示。

1.       向類中新增如下的成員變數(紅色部分):

  public class Form1 : System.Windows.Forms.Form

  {

      private ESRI.ArcGIS.MapControl.AxMapControl axMapControl1;

      private ESRI.ArcGIS.PageLayoutControl.AxPageLayoutControl axPageLayoutControl1;

      private ESRI.ArcGIS.TOCControl.AxTOCControl axTOCControl1;

      private ESRI.ArcGIS.ToolbarControl.AxToolbarControl axToolbarControl1;

   private IToolbarMenu m_ToolbarMenu = new ToolbarMenuClass(); // 彈出式選單

// ……

2.       Form_Load事件中向ToolbarControl增加命令程式碼的後面載入文件程式碼的前面增加如下程式碼。

     private void Form1_Load(object sender, System.EventArgs e)

     {

         // 前面是增加地圖導航的程式碼……

// 共享ToolbarControl的命令池

         m_ToolbarMenu.CommandPool = axToolbarControl1.CommandPool;

         // 向ToolbarMenu增加命令

         progID = "esriControlToolsPageLayout.ControlsPageZoomInFixedCommand";

         m_ToolbarMenu.AddItem(progID, -1, -1, false,

             esriCommandStyles.esriCommandStyleIconAndText);

         progID = "esriControlToolsPageLayout.ControlsPageZoomOutFixedCommand";

         m_ToolbarMenu.AddItem(progID, -1, -1, false,

             esriCommandStyles.esriCommandStyleIconAndText);

         progID = "esriControlToolsPageLayout.ControlsPageZoomWholePageCommand";

         m_ToolbarMenu.AddItem(progID, -1, -1, false,

             esriCommandStyles.esriCommandStyleIconAndText);

         progID = "esriControlToolsPageLayout.ControlsPageZoomPageToLastExtentBackCommand";

         m_ToolbarMenu.AddItem(progID, -1, -1, true,

             esriCommandStyles.esriCommandStyleIconAndText);

         progID = "esriControlToolsPageLayout.ControlsPageZoomPageToLastExtentForwardCommand";

         m_ToolbarMenu.AddItem(progID, -1, -1, false,

             esriCommandStyles.esriCommandStyleIconAndText);

         // 設定與PageLayoutControl掛接

       m_ToolbarMenu.SetHook(axPageLayoutControl1);

            // 後面是載入圖形文件的程式碼……

            // ……

3.       在設計模式顯示窗體並從屬性視窗中選擇axPageLayoutControl1,顯示axPageLayoutControl事件。雙擊OnMouseDown事件,向程式碼視窗中增加事件處理程式碼。

4.       axPageLayoutControl1_OnMouseDown事件中增加如下程式碼:

     private void axPageLayoutControl1_OnMouseDown(object sender, ESRI.ArcGIS.PageLayoutControl.IPageLayoutControlEvents_OnMouseDownEvent e)

     {

         // 彈出ToolbarMenu

         if ( e.button == 2)

         {

             m_ToolbarMenu.PopupMenu(e.x, e.y, axPageLayoutControl1.hWnd);

         }

}

5.生成並執行應用程式。在PageLayoutControl的顯示區域單擊右鍵以顯示彈出選單,併為頁面佈局導航。

(八) 在TOCControl中控制標籤編輯

TOCControl預設允許使用者自動地切換圖層的可見性並改變顯示在目錄表中的名稱。你可以增加程式碼防止使用者在編輯名稱時輸入空的字串。

1.       Form_Load事件的開始增加下列程式碼。

     private void Form1_Load(object sender, System.EventArgs e)

     {

         // 當縮放時禁止重繪

         this.SetStyle(ControlStyles.EnableNotifyMessage, true);

         // 設定標籤編輯為手動方式

         axTOCControl1.LabelEdit = esriTOCControlEdit.esriTOCControlManual;

            // 後面是載入文件程式碼

            // ……

2.       在設計模式顯示窗體並從屬性視窗選擇AxTOCControl1控制元件,顯示AxTOCControl事件。雙擊OnEndLabelEdit向程式碼視窗新增事件處理函式。

3.axTOCControl1_OnEndLabelEdit事件中新增以下程式碼:

     private void axTOCControl1_OnEndLabelEdit(object sender, ESRI.ArcGIS.TOCControl.ITOCControlEvents_OnEndLabelEditEvent e)

     {

         // 禁止在編輯標籤時鍵入空字串

         string newLabel = e.newLabel;

         if ( newLabel.Trim() == "" )

         {

             e.canEdit = false;

         }

     }

4.       生成並生成應用程式。編輯TOCControl控制元件的地圖、圖層、標題或圖例類的標籤,在其上點選一次,然後再點一次呼叫標籤編輯。試著用空字串替代標籤。在編輯期間,你可以隨時使用鍵盤上的ESC鍵取消編輯。

(九) 在MapControl上繪製圖形

你可以將MapControl作為縮圖窗體使用,並在其上繪製顯示PageLayoutControl內的焦點地圖的當前範圍。當你瀏覽PageLayoutControl資料框架內的資料時,你將看到縮圖視窗也進行了更新。

注:使用地圖導航工具導航焦點圖(活動圖)將改變PageLayoutControl中焦點地圖的範圍並引起MapControl更新。使用頁面佈局工具導航頁面佈局將改變頁面佈局的範圍(不是PageLayoutControl中的焦點圖的範圍),而MapControl將不更新。

1.       向類中增加下列成員變數:

public class Form1 : System.Windows.Forms.Form

{

     private ESRI.ArcGIS.MapControl.AxMapControl axMapControl1;

     private ESRI.ArcGIS.PageLayoutControl.AxPageLayoutControl axPageLayoutControl1;

     private ESRI.ArcGIS.TOCControl.AxTOCControl axTOCControl1;

     private ESRI.ArcGIS.ToolbarControl.AxToolbarControl axToolbarControl1;

     private IToolbarMenu m_ToolbarMenu = new ToolbarMenuClass(); // 彈出式選單

private IEnvelope m_Envelope;   // MapControl繪製的範圍

private Object m_FillSymbol;    // 在MapControl上繪製範圍使用的符號

private ITransformEvents_VisibleBoundsUpdatedEventHandler

          visBoundsUpdatedE;          // PageLayoutControl的焦點圖事件

注:宣告的變數visBoundsUpdatedE是一個託管。託管是一個類,它能夠擁有對指定方法的引用,並使它連結到一個特定的事件。在事件和方法之間的連結過程有時在.NET中被稱作wiring

2.       建立一個叫CreateOverviewSymbol的新函式。這個函式是建立你將在MapControl中使用的符號的地方,此符號是用來描述PageLayoutControl焦點地圖資料範圍的。函式中增加的程式碼如下:

private void CreateOverviewSymbol()

     {

         // 獲取IRGBColor介面

         IRgbColor color = new RgbColor();

         // 設定顏色屬性

         color.RGB = 255;

         // 獲取ILine符號介面

         ILineSymbol outline = new SimpleLineSymbol();

         // 設定線符號屬性

         outline.Width = 1.5;

         outline.Color = color;

         // 獲取IFillSymbol介面

         ISimpleFillSymbol simpleFillSymbol = new SimpleFillSymbolClass();

         // 設定填充符號屬性

         simpleFillSymbol.Outline = outline;

         simpleFillSymbol.Style = esriSimpleFillStyle.esriSFSHollow;

         m_FillSymbol = simpleFillSymbol;           

}

3.       Form_Load事件在TOCControl標籤編輯程式碼之前呼叫CreateOverviewSymbol函式。

     private void Form1_Load(object sender, System.EventArgs e)

     {

         // 當縮放時禁止重繪

         this.SetStyle(ControlStyles.EnableNotifyMessage, true);

         // 建立MapControl使用的符號

CreateOverviewSymbol();

// 下面是標籤編輯處理程式碼

// ……

}

4.       增加下列OnVisibleBoundsUpdated函式。此函式將與地圖範圍改變時觸發的事件相連線,並用來設定新的地圖可見邊界範圍框。通過重新整理MapControl,你強制它重繪其上顯示的圖形。

     private void OnVisibleBoundsUpdated(IDisplayTransformation sender, bool sizeChanged)

     {

         // 設定新的可見範圍

         m_Envelope = sender.VisibleBounds;

         // 改變MapControl的前景狀態

axMapControl1.ActiveView.PartialRefresh(

esriViewDrawPhase,esriViewForeground, nullnull);      

}

5.      PageLayoutControl預設的事件介面是IPageLayoutControlEvents。這些事件不告訴我們資料邊框內的地圖範圍。為此你需要使用PageLayoutControl的焦點地圖的ItransformEvents介面。在PageLayoutControl_OnPageLayoutReplaced事件處理中的載入文件程式碼前面增加以下程式碼。

private void axPageLayoutControl1_OnPageLayoutReplaced(object sender, ESRI.ArcGIS.PageLayoutControl.IPageLayoutControlEvents_OnPageLayoutReplacedEvent e)

     {

         // 獲取PageLayoutControl中焦點地圖的IActiveView物件

         IActiveView activeView = (IActiveView)

             axPageLayoutControl1.ActiveView.FocusMap;

         // 捕捉PageLayoutControl的焦點圖的ITransformEvents事件

         visBoundsUpdatedE = new        ITransformEvents_VisibleBoundsUpdatedEventHandler(OnVisibleBoundsUpdated);

         ((ITransformEvents_Event)activeView.ScreenDisplay

             .DisplayTransformation).VisibleBoundsUpdated += visBoundsUpdatedE;

         // 獲取焦點圖的範圍

m_Envelope = activeView.Extent;

// 後面是載入地圖文件的程式碼

// ……

6.       在設計模式下顯示窗體並從屬性窗中選擇axMapControl1,顯示axMapControl事件。雙擊OnAfterDraw向程式碼視窗中增加事件處理。

7.       axMapControl1_OnAfterDraw事件處理中增加以下程式碼,使用前面建立的符號繪製MapControl顯示邊框。

private void axMapControl1_OnAfterDraw(object sender, ESRI.ArcGIS.MapControl.IMapControlEvents2_OnAfterDrawEvent e)

     {

         if ( m_Envelope == null)

         {

             return;

         }

         // 如果前景狀態被重繪

         esriViewDrawPhase viewDrawPhase = (esriViewDrawPhase)e.viewDrawPhase;

         if ( viewDrawPhase == esriViewDrawPhase.esriViewForeground )

         {

             IGeometry geometry = m_Envelope;

             axMapControl1.DrawShape(geometry, ref m_FillSymbol);

         }

}

生成並執行應用程式。使用你先前已經加好的地圖導航工具改變PageLayoutControl中焦點地圖的範圍。新的範圍被繪製在MapControl上。

(十) 建立自定義工具

建立協同MapControlPageLayoutControl一起運作的自定義命令和工具,與你或許已經做過的建立ESRI ArcMap應用程式命令非常相似。你將建立一個在PageLayoutControl滑鼠點選位置新增包含當天日期的文字元素的自定義工具。不管用何種方法,建立同MapControlToolbarControl協作的命令與同PageLayoutControl一樣。

這個自定義工具的相關程式碼與其他本方案原始碼一樣很有用。如果你想要直接使用自定義命令,而不自己建立它,請直接到第24步。

1.       新建專案對話方塊建立一個新的Visual C# “類庫”專案。

2.       將專案命名為“Commands”,並選擇儲存位置存貯之。

3.       單擊專案選單並選擇“新增引用(R)…”。

4.       在新增引用對話方塊中,複選“ESRI.ArcGIS.Carto”,“ESRI.ArcGIS.Display”,“ESRI.ArcGIS.Geometry”,“ESRI.ArcGIS.System”,“ESRI.ArcGIS.SystemUI”,“ESRI.ArcGIS..Utility”和“ESRI.ArcGIS.ControlCommands”。

5.       在專案中增加一個類,名字叫AddDateTool

6.       點選專案選單並選擇新增現有項,瀏覽樣例原始碼目錄並找到date.bmp檔案將其加入到你的專案。

7.       解決方案資源管理器中點選date.bmp在屬性視窗顯示其屬性。改變生成操作屬性為嵌入的資源。這張點陣圖將被用來作為命令按鈕的外觀。

8.       改變AddDateTool的名稱空間的名稱為CSharpDotNETCommands

namespace CSharpDotNETCommands

{

……

注:要在Visual Basi .NET中改變名稱空間的名稱,則在解決方案資源管理器的專案上點選右鍵並選擇屬性,在專案屬性頁中選擇常規並改變根名稱空間後,按確定

9.在AddDateTool類程式碼視窗的頂部增加以下引用。

using System;

using ESRI.ArcGIS.Carto;

using ESRI.ArcGIS.Display;

using ESRI.ArcGIS.Geometry;

using ESRI.ArcGIS.SystemUI;

using ESRI.ArcGIS.esriSystem;

using ESRI.ArcGIS.ControlCommands;

using ESRI.ArcGIS.Utility.BaseClasses;

using System.Runtime.InteropServices;

10.     指定AddDateTool類繼承自ESRI BaseTool抽象類,並增加密封(sealed)類修