生活随笔
收集整理的這篇文章主要介紹了
利用ArcGIS Engine、VS .NET和Windows控件开发GIS应用
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
?
Dixon 原文? 用ArcGIS Engine、VS .NET和Windows控件開發(fā)GIS應(yīng)用
此過程說明適合那些使用.NET建立和部署應(yīng)用的開發(fā)者,它描述了使用ArcGIS控件建立和部署應(yīng)用的方法和步驟。 你可以在下面的目錄下找到相應(yīng)的樣例程序: <安裝目錄>/DeveloperKit/Samples/Developer_Guide_Scenarios/ ArcGIS_Engine/Building_an_ArcGIS_Control_Application/Map_Viewer 注:ArcGIS樣例程序不包含在ArcGIS Engine開發(fā)工具包“典型”安裝方式中。如果你沒有安裝它們,則可以重新運(yùn)行開發(fā)工具包安裝向?qū)?#xff0c;選擇“定制”或“修改”方式,并選擇軟件開發(fā)包下的樣例項(xiàng)進(jìn)行安裝。
一、項(xiàng)目描述 利用視窗控件建立應(yīng)用程序的目標(biāo)是演示并使你熟悉在微軟Visual Studio .NET API中使用標(biāo)準(zhǔn)ArcGIS控件開發(fā)和部署GIS應(yīng)用所需的步聚。本節(jié)中使用了Visual Studio .NET開發(fā)環(huán)境中的MapControl、?PageLayoutControl、TOCControl和ToolbarControl等視窗控件。COM、Java和C++程序員應(yīng)該參考如下章節(jié):利用ActiveX建立應(yīng)用程序、利用可視化JavaBeans建立應(yīng)用程序、建立命令行方式的Java應(yīng)用和建立命令行方式的C++應(yīng)用。 本節(jié)演示了創(chuàng)建查看ArcMap和ArcGIS桌面應(yīng)用圖形文檔的GIS應(yīng)用程序的步驟。此節(jié)包含了以下技術(shù): l????在微軟Visual Studio .NET中加載和嵌入ArcGIS控件。 l????向PageLayoutControl和MapControl中加載圖形文檔。 l????設(shè)置ToolbarControl和TOCControl的綁定控件。 l????處理窗口縮放。 l????向ToolbarControl添加ArcGIS Engine命令和工具。 l????創(chuàng)建彈出式菜單 l????在TOCControl中管理標(biāo)簽編輯 l????在MapControl中繪制圖形。 l????為MapControl、PageLayoutControl和ToolbarControl創(chuàng)建定制工具。 l????用戶化ToolbarControl。 l????在Windows操作系統(tǒng)中部署應(yīng)用。 二、概述 本方案使用微軟Visual Studio .NET開發(fā)環(huán)境加以實(shí)現(xiàn),并使用了ESRI interop程序集(Interop Assemblies),它服務(wù)于被放置在.NET窗體上的、位于.NET?窗體控件(.NET Windows Controls)中的ArcGIS控件,這些程序集在托管的.NET代碼和非托管的COM代碼之間起了橋梁作用。對(duì)COM ArcGIS控件(COM ArcGIS Controls)成員的引用都要經(jīng)過Interop程序集,然后到達(dá)實(shí)際的COM對(duì)象。同樣,也從COM對(duì)象經(jīng)過Interop程序集到達(dá).NET應(yīng)用程序。每個(gè)ArcGIS Engine控件具有方法、屬性與事件,它們能夠被控件嵌入的容器(如,.NET窗體)訪問。每個(gè)控件對(duì)象及其功能可以與其他ESRI ArcObjects和自定義控件組合使用,創(chuàng)建用戶化的客戶應(yīng)用程序。 此方案是使用了C#和Visual Basic .NET兩種語言創(chuàng)建,但以下技術(shù)實(shí)現(xiàn)集中傾向于C#方案。許多開發(fā)者可能會(huì)感覺用Visual Basic .NET更舒服,那是因?yàn)樗麄円呀?jīng)比較熟悉Visual Basic 6.0代碼,然而,對(duì)于Java和C++程序員來說,他們將會(huì)覺得對(duì)C#程序語言的語法更熟悉。無論你使用哪種開發(fā)環(huán)境,對(duì)于使用ArcGIS控件的好壞既依賴于你的編程環(huán)境技術(shù),也依賴于你所掌握的ArcObjects技術(shù)。 在本方案中,使用ToolbarControl、TOCControl、PageLayoutControl和MapControl來為應(yīng)用程序提供用戶界面。這些ArcGIS控件與其他ArcObjects和ArcGIS Engine命令被開發(fā)者一起使用,用來創(chuàng)建一個(gè)GIS視窗應(yīng)用。 三、設(shè)計(jì) 此方案在設(shè)計(jì)時(shí),首先強(qiáng)調(diào)了ArcGIS?控件如何互相之間進(jìn)行交互,其次,向開發(fā)者解釋說明了ArcGIS?控件對(duì)象模型的一部分。 每個(gè).NET ArcGIS Engine控件包含有一套能夠被嵌入其內(nèi)的窗口即時(shí)訪問的屬性頁。這些屬性些為控件屬性和方法的選擇提供了捷徑,并且允許開發(fā)者不寫任何代碼即可創(chuàng)建一個(gè)應(yīng)用程序。本方案并沒有使用屬性頁,而是采用寫代碼的方式建立應(yīng)用程序。關(guān)于屬性頁的更進(jìn)一步的信息,請(qǐng)參考ArcGIS開發(fā)幫助(ArcGIS Developer Help)。 四、條件需求 要順利地完成以下方案,你需要以下條件(對(duì)于部署的需求將在后續(xù)的部署章節(jié)涉及到): l???????安裝具有授權(quán)文件的ArcGIS Engine開發(fā)工具包(Developer Kit),使之能夠用于開發(fā)。 l???????安裝有微軟Visual Studio .NET 2003開發(fā)環(huán)境和微軟.NET Framework 1.1及其相應(yīng)協(xié)議。 l???????熟悉微軟Windows操作系統(tǒng)和Microsoft Visual Studio .NET的工作知識(shí),會(huì)用C#或Visual Basic .NET編程語言。當(dāng)然,此方案中提供了一些如何在Microsoft Visual Studio .NET中使用ArcGIS控件的信息,但它不能替代對(duì)開發(fā)環(huán)境的培訓(xùn)。 l???????不需要對(duì)ESRI其它軟件有足夠的經(jīng)驗(yàn),但如果以前對(duì)ArcObjects有所接觸并對(duì)ArcGIS應(yīng)用(如,ArcCatalog,ArcMap)有一個(gè)基本了解,則對(duì)于開發(fā)更有利。 l???????訪問來自本方案的樣例數(shù)據(jù)和代碼,它位于: <安裝目錄>/DeveloperKit/Samples/Developer_Guide_Scenarios/ ArcGIS_Engine/Building_an_ArcGIS_Control_Application/Map_Viewer 本方案中使用到的控件和庫如下: | l???????AxMapControl | l???????AxTOCControl |
| l???????AxPageLayoutControl | l???????AxToolbarControl |
| l???????ESRI.ArcGIS.Carto | l???????ESRI.ArcGIS.System |
| l???????ESRI.ArcGIS.Display | l???????ESRI.ArcGIS.SystemUI |
| l???????ESRI.ArcGIS.Geometry | l???????ESRI.ArcGIS.Utility |
| l???????esriMapControl | l???????esriTOCControl |
| l???????esriPageLayoutControl | l???????esriToolbarControl |
五、實(shí)現(xiàn) 下面的實(shí)現(xiàn)過程中提供了你成功完成方案所需所有代碼。假設(shè)你對(duì)于開發(fā)環(huán)境已經(jīng)有了一定的知識(shí),所以下面沒有逐步地詳細(xì)介紹如何用Microsoft Visual Studio .NET開發(fā)應(yīng)用。 (一)加載ArcGIS控件 在你為應(yīng)用程序編寫代碼之前,應(yīng)該先將應(yīng)用程序?qū)⒂玫降腁rcGIS控件和其他ArcGIS Engine庫引用裝載到開發(fā)環(huán)境之中。 1.啟動(dòng)Visual Studio .NET,并從新建項(xiàng)目對(duì)話框中創(chuàng)建一個(gè)新的Visual C#?“Windows應(yīng)用程序”項(xiàng)目。???? 2.將項(xiàng)目命名為“Controls”,并選擇位置存取該項(xiàng)目。???? 3.在“工具箱”的“Windows窗體”標(biāo)簽欄中單擊右鍵,然后從上下文菜單中選擇“添加/移除項(xiàng)(I)…”。???? 4.在“自定義工具箱”中選擇“.NET Framework組件”,并復(fù)選“AxMapControl”,“AxPageLayoutControl”,“AxTOCControl”和“AxToolbarControl”,單擊確定按鈕。這樣所選擇的控件將顯示在工具箱的Windows窗體標(biāo)簽欄中。???? 5.單擊項(xiàng)目菜單,并選擇“添加引用(R)…”。???? 6.在添加引用對(duì)話框中,雙擊“ESRI.ArcGIS.Carto”,“ESRI.ArcGIS.Display”,“ESRI.ArcGIS.Geometry”,“ESRI.ArcGIS.System”,“ESRI.ArcGIS.SystemUI”,“ESRI.ArcGIS.Utility”。單擊確定。???? 注:對(duì)于ESRI .NET程序集,將通過具體實(shí)例來說明,并使用.NET框架提供的COM傳送服務(wù)從你的C#項(xiàng)目中調(diào)用ESRI對(duì)象庫中的實(shí)體對(duì)象。 (二)在容器中嵌入ArcGIS控件 在你能夠訪問每個(gè)控件的事件、屬性和方法之前,需要將控件嵌入到.NET容器中。一旦將控件嵌入窗體內(nèi),它們將圖形化應(yīng)用程序的用戶界面。 1.在設(shè)計(jì)模式下打開.NET窗體。?????? 2.雙擊工具箱Windows標(biāo)簽欄中的AxMapControl控件,將MapControl加入到窗體上。?????? 3.再將AxPageLayoutControl、AxTOCControl和AxToolbarControl如上添加到窗體中。?????? 4.重新調(diào)整窗體上各個(gè)控件的大小和位置,調(diào)整結(jié)果如下所示。?????? 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#是區(qū)分大小寫的。當(dāng)你鍵入“ESRI.”時(shí),智能敏感的自動(dòng)完成功能將允許你通過按Tab鍵完成下一節(jié)。 (三)加載Map文檔到MapControl與PageLayoutControl 單獨(dú)的數(shù)據(jù)層或者使用ArcMap、ArcGIS桌面應(yīng)用程序產(chǎn)生的圖形文檔,能夠被加載到MapControl和PageLayoutControl中。你可以加載樣例圖形文檔,或者加載你自己的圖形文檔。后面你將增加一個(gè)瀏覽圖形文檔的對(duì)話框。 1.選擇Form_Load事件,并輸入下列代碼(如果你使用你自己的圖形文檔,要替換為正確的文件名):?????? ?????//?使用相對(duì)路徑向PageLayoutControl加載一個(gè)圖形文檔 ?????string?filename = @"../../../../../../../../Data//ArcGIS_Engine_Developer_Guide//gulf of st. lawrence.mxd"; ?????if?( axPageLayoutControl1.CheckMxFile(filename) ) ???? { ???????? axPageLayoutControl1.LoadMxFile(filename, ""); ???? } 2.在設(shè)計(jì)模式顯示窗體并從屬性窗選擇axPageLayoutControl1控件,顯示axPageLayoutControl事件。在OnPageLayoutReplaced事件上雙擊向代碼窗口添加該事件的處理函數(shù)。?????? 3.?????在axPageLayoutControl1_OnPageLayoutReplaced事件中鍵入以下向MapControl加載樣例圖形文檔的代碼。當(dāng)文檔被裝載入PageLayoutControl時(shí)OnPageLayoutReplaced事件將會(huì)被觸發(fā)。 ?????privatevoid?axPageLayoutControl1_OnPageLayoutReplaced(object?sender, ESRI.ArcGIS.PageLayoutControl.IPageLayoutControlEvents_OnPageLayoutReplacedEvent e) ???? { ?????????//?加載同樣的文檔到MapControl ???????? axMapControl1.LoadMxFile(axPageLayoutControl1.DocumentFilename,?null,?null); ?????????//?設(shè)置MapControl顯示范圍至數(shù)據(jù)的全局范圍 ???????? axMapControl1.Extent = axMapControl1.FullExtent; } (四)設(shè)置ToolbarControl與TOCControl控件的綁定控件 對(duì)于此應(yīng)用程序,TOCControl和ToolbarControl控件將與PageLayoutControl相互協(xié)作,而不是MapControl。為此PageLayoutControl必須設(shè)置為綁定控件。TOCControl使用綁定的ActiveView顯示圖形、圖層和符號(hào)。而位于ToolbarControl上的任何命令、工具或菜單項(xiàng)會(huì)受綁定控件的顯示影響。 1.在Form_Load事件中的加載文檔代碼的后面鍵入以下紅色部分內(nèi)容:?????? ?????privatevoid?Form1_Load(object?sender, System.EventArgs e) ???? { ?????????//?使用相對(duì)路徑向PageLayoutControl加載一個(gè)圖形文檔 ?????????string?filename = @"../../../../../../../../Data//ArcGIS_Engine_Developer_Guide//gulf of st. lawrence.mxd"; ?????????if?( axPageLayoutControl1.CheckMxFile(filename) ) ???????? { ???????????? axPageLayoutControl1.LoadMxFile(filename, ""); ???????? } ? ???????? //?設(shè)置綁定控件 ???????? axTOCControl1.SetBuddyControl(axPageLayoutControl1); ???????? axToolbarControl1.SetBuddyControl(axPageLayoutControl1); } 2.生成并運(yùn)行應(yīng)用程序。圖形文檔被加載到PageLayoutControl,并且TOCControl列出了圖形文檔中的數(shù)據(jù)圖層。使用TOCControl通過復(fù)選和取消復(fù)選框控制圖層的可見性。默認(rèn)地,圖形文檔的焦點(diǎn)圖(focus map)被裝入MapControl控件。在這種當(dāng)前情況下,ToolbarControl控件顯示是空的,因?yàn)闆]有為它添加任何命令。試著縮放窗體,你會(huì)注意到控件不會(huì)改變尺寸。?????? (五)處理窗口縮放 當(dāng)窗口在運(yùn)行時(shí)進(jìn)行縮放時(shí),PageLayoutControl和MapControl不會(huì)自動(dòng)改變自身的尺寸。要改變控件的尺寸以便它們總是與匹配窗口的范圍,你必須將控件錨定在窗口上。如果PageLayoutControl或MapControl包含大量的數(shù)據(jù),在窗口縮放期間重繪這些數(shù)據(jù)顯得相當(dāng)重要。為了提高執(zhí)行效率,你可以禁止數(shù)據(jù)重繪直到縮放操作完成后再重繪之。在縮放時(shí),可以用一個(gè)可伸縮的位圖來替代重繪數(shù)據(jù)。 1.在設(shè)計(jì)模式顯示窗體并從屬性窗口中選擇axPageLayoutControl1。單擊Anchor屬性,將axPageLayoutControl1錨定在窗體的頂、左、底和右部。?????? 2.錨定axMapControl控件到窗體的頂、左和底部。?????? 3.在Form_Load事件的開頭增加以下代碼:?????? //?當(dāng)縮放時(shí)禁止重繪 this.SetStyle(ControlStyles.EnableNotifyMessage,?true); 4.向類增加以下常量:?????? ????????publicclass?Form1 : System.Windows.Forms.Form ???? { ???????? //?…… ?????????privateconstint?WM_ENTERSIZEMOVE = 0x231; privateconstint?WM_EXITSIZEMOVE = 0x232; ?//?…… } 5.向重載的OnNotifyMessage方法中增加下列代碼:?????? ?????protectedoverridevoid?OnNotifyMessage(Message m) ???? { ?????????base.OnNotifyMessage (m); ???????? ???????? //?以下為手工添加的代碼 ?????????if?( m.Msg == WM_ENTERSIZEMOVE) ???????? { ???????????? axMapControl1.SuppressResizeDrawing(true, 0); ???????????? axPageLayoutControl1.SuppressResizeDrawing(true, 0); ???????? } ?????????elseif?( m.Msg == WM_EXITSIZEMOVE) ???????? { ???????????? axMapControl1.SuppressResizeDrawing(false, 0); ???????????? axPageLayoutControl1.SuppressResizeDrawing(false, 0); ???????? } } 6.生成并運(yùn)行應(yīng)用程序,試著縮放窗口。?????? 注:禁止縮放時(shí)重畫方法是通過檢查發(fā)送到窗體的Windows消息工作的。當(dāng)窗口開發(fā)縮放時(shí),Windows發(fā)送WM_ENTERSIZEMOVE窗口消息。此時(shí),我們禁止在MapControl和PageLayoutControl上繪制圖形,而是使用“stretchy bitmap”繪制。當(dāng)Windows發(fā)送WM_EXITSIZEMOVE消息時(shí),窗體結(jié)束縮放,這時(shí)我們?nèi)恐乩L新的范圍。 (六)向ToolbarControl增加命令 ArcGIS Engine提供了120多個(gè)命令和工具,它們與MapControl、PageLayoutControl和ToolbarControl直接相互協(xié)作。這些命令和工具為你提供了大量的經(jīng)常使用的地圖導(dǎo)航、圖形管理、地物選擇等方面的GIS功能。現(xiàn)在將在你的應(yīng)用程序中增加這些命令和工具的一部分。 1.在Form_Load事件中的加載文檔代碼之前添加如下代碼。?????? ?????????//?增加打開檔命令 ?????????string?progID; ???????? progID = "esriControlToolsGeneric.ControlsOpenDocCommand"; ???????? axToolbarControl1.AddItem(progID, -1, -1,?false, 0, ???????????? esriCommandStyles.esriCommandStyleIconOnly); ? ?????????//?增加PageLayout導(dǎo)航命令 ???????? 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); ? ??????????? ?????????//?增加地圖導(dǎo)航命令 ???????? 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); //?使用相對(duì)路徑向PageLayoutControl加載一個(gè)圖形文檔 //?…… 2.生成并運(yùn)行應(yīng)用程序。現(xiàn)在ToolbarControl包含了ArcGIS Engine命令和工具,你可以使用它們導(dǎo)航加載到PageLayoutControl中的圖形文檔。使用頁面布局命令對(duì)當(dāng)前的頁面布局進(jìn)行導(dǎo)航控制,要對(duì)存在于數(shù)據(jù)框架中的數(shù)據(jù)進(jìn)行導(dǎo)航則使用地圖命令。利用找開文檔命令可以瀏覽并加載其他的圖形文檔。?????? (七)給PageLayoutControl添加彈出式菜單 與給跟綁定控件協(xié)作的ToolbarControl增加ArcGIS Engine命令一樣,按照前面的步驟,你也可以從ArcGIS Engine命令創(chuàng)建彈出式菜單。下面將向你的應(yīng)用程序中增加與PageLayoutControl協(xié)作的彈出式菜單。當(dāng)在PageLayoutControl可視區(qū)域點(diǎn)擊鼠標(biāo)右鍵的時(shí)候,彈出式菜單將顯示。 1.向類中添加如下的成員變量(紅色部分):?????? ?publicclass?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增加命令代碼的后面加載文檔代碼的前面增加如下代碼。?????? ?????privatevoid?Form1_Load(object?sender, System.EventArgs e) ???? { ???????? //?前面是增加地圖導(dǎo)航的代碼…… ???????? //?共享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); ? ?????????//?設(shè)置與PageLayoutControl掛接 ?????? m_ToolbarMenu.SetHook(axPageLayoutControl1); ?????? ??????????? //?后面是加載圖形文檔的代碼…… ??????????? //?…… 3.在設(shè)計(jì)模式顯示窗體并從屬性窗口中選擇axPageLayoutControl1,顯示axPageLayoutControl事件。雙擊OnMouseDown事件,向代碼窗口中增加事件處理代碼。?????? 4.在axPageLayoutControl1_OnMouseDown事件中增加如下代碼:?????? ?????privatevoid?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.?????生成并運(yùn)行應(yīng)用程序。在PageLayoutControl的顯示區(qū)域單擊右鍵以顯示彈出菜單,并為頁面布局導(dǎo)航。 ? (八)在TOCControl中控制標(biāo)簽編輯 TOCControl默認(rèn)允許用戶自動(dòng)地切換圖層的可見性并改變顯示在目錄表中的名稱。你可以增加代碼防止用戶在編輯名稱時(shí)輸入空的字符串。 1.在Form_Load事件的開始增加下列代碼。?????? ?????privatevoid?Form1_Load(object?sender, System.EventArgs e) ???? { ?????????//?當(dāng)縮放時(shí)禁止重繪 ?????????this.SetStyle(ControlStyles.EnableNotifyMessage,?true); ? ?????????//?設(shè)置標(biāo)簽編輯為手動(dòng)方式 ???????? axTOCControl1.LabelEdit = esriTOCControlEdit.esriTOCControlManual; ? ??????????? //?后面是加載文檔代碼 ??????????? //?…… 2.在設(shè)計(jì)模式顯示窗體并從屬性窗口選擇AxTOCControl1控件,顯示AxTOCControl事件。雙擊OnEndLabelEdit向代碼窗口添加事件處理函數(shù)。?????? 3.?????在axTOCControl1_OnEndLabelEdit事件中添加以下代碼: ?????privatevoid?axTOCControl1_OnEndLabelEdit(object?sender, ESRI.ArcGIS.TOCControl.ITOCControlEvents_OnEndLabelEditEvent e) ???? { ?????????//?禁止在編輯標(biāo)簽時(shí)鍵入空字串 ?????????string?newLabel = e.newLabel; ?????????if?( newLabel.Trim() == "" ) ???????? { ???????????? e.canEdit =?false; ???????? } ???? } 4.生成并生成應(yīng)用程序。編輯TOCControl控件的地圖、圖層、標(biāo)題或圖例類的標(biāo)簽,在其上點(diǎn)擊一次,然后再點(diǎn)一次調(diào)用標(biāo)簽編輯。試著用空字串替代標(biāo)簽。在編輯期間,你可以隨時(shí)使用鍵盤上的ESC鍵取消編輯。?????? (九)在MapControl上繪制圖形 你可以將MapControl作為縮略圖窗體使用,并在其上繪制顯示PageLayoutControl內(nèi)的焦點(diǎn)地圖的當(dāng)前范圍。當(dāng)你瀏覽PageLayoutControl數(shù)據(jù)框架內(nèi)的數(shù)據(jù)時(shí),你將看到縮略圖窗口也進(jìn)行了更新。 注:使用地圖導(dǎo)航工具導(dǎo)航焦點(diǎn)圖(活動(dòng)圖)將改變PageLayoutControl中焦點(diǎn)地圖的范圍并引起MapControl更新。使用頁面布局工具導(dǎo)航頁面布局將改變頁面布局的范圍(不是PageLayoutControl中的焦點(diǎn)圖的范圍),而MapControl將不更新。 1.向類中增加下列成員變量:?????? publicclass?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上繪制范圍使用的符號(hào) ?????private?ITransformEvents_VisibleBoundsUpdatedEventHandler ????????? visBoundsUpdatedE;??????????// PageLayoutControl的焦點(diǎn)圖事件 注:聲明的變量visBoundsUpdatedE是一個(gè)托管。托管是一個(gè)類,它能夠擁有對(duì)指定方法的引用,并使它鏈接到一個(gè)特定的事件。在事件和方法之間的鏈接過程有時(shí)在.NET中被稱作wiring。 2.創(chuàng)建一個(gè)叫CreateOverviewSymbol的新函數(shù)。這個(gè)函數(shù)是創(chuàng)建你將在MapControl中使用的符號(hào)的地方,此符號(hào)是用來描述PageLayoutControl焦點(diǎn)地圖數(shù)據(jù)范圍的。函數(shù)中增加的代碼如下:?????? privatevoid?CreateOverviewSymbol() ???? { ?????????//?獲取IRGBColor接口 ???????? IRgbColor color =?new?RgbColor(); ?????????//?設(shè)置顏色屬性 ???????? color.RGB = 255; ? ?????????//?獲取ILine符號(hào)接口 ???????? ILineSymbol outline =?new?SimpleLineSymbol(); ?????????//?設(shè)置線符號(hào)屬性 ???????? outline.Width = 1.5; ???????? outline.Color = color; ? ?????????//?獲取IFillSymbol接口 ???????? ISimpleFillSymbol simpleFillSymbol =?new?SimpleFillSymbolClass(); ?????????//?設(shè)置填充符號(hào)屬性 ???????? simpleFillSymbol.Outline = outline; ???????? simpleFillSymbol.Style = esriSimpleFillStyle.esriSFSHollow; ???????? m_FillSymbol = simpleFillSymbol;??????????? } 3.從Form_Load事件在TOCControl標(biāo)簽編輯代碼之前調(diào)用CreateOverviewSymbol函數(shù)。?????? ?????privatevoid?Form1_Load(object?sender, System.EventArgs e) ???? { ?????????//?當(dāng)縮放時(shí)禁止重繪 ?????????this.SetStyle(ControlStyles.EnableNotifyMessage,?true); ? ?????????//?創(chuàng)建MapControl使用的符號(hào) CreateOverviewSymbol(); ? //?下面是標(biāo)簽編輯處理代碼 //?…… } 4.增加下列OnVisibleBoundsUpdated函數(shù)。此函數(shù)將與地圖范圍改變時(shí)觸發(fā)的事件相連接,并用來設(shè)置新的地圖可見邊界范圍框。通過刷新MapControl,你強(qiáng)制它重繪其上顯示的圖形。?????? ?????privatevoid?OnVisibleBoundsUpdated(IDisplayTransformation sender,?bool?sizeChanged) ???? { ?????????//?設(shè)置新的可見范圍 ???????? m_Envelope = sender.VisibleBounds; ? ?????????//?改變MapControl的前景狀態(tài) axMapControl1.ActiveView.PartialRefresh( esriViewDrawPhase,esriViewForeground,?null,?null);?????? } 5.默認(rèn)的事件接口是IPageLayoutControlEvents。這些事件不告訴我們數(shù)據(jù)邊框內(nèi)的地圖范圍。為此你需要使用PageLayoutControl的焦點(diǎn)地圖的ItransformEvents接口。在PageLayoutControl_OnPageLayoutReplaced事件處理中的加載文檔代碼前面增加以下代碼。??????PageLayoutControl privatevoid?axPageLayoutControl1_OnPageLayoutReplaced(object?sender, ESRI.ArcGIS.PageLayoutControl.IPageLayoutControlEvents_OnPageLayoutReplacedEvent e) ???? { ?????????//?獲取PageLayoutControl中焦點(diǎn)地圖的IActiveView對(duì)象 ???????? IActiveView activeView = (IActiveView) ???????????? axPageLayoutControl1.ActiveView.FocusMap; ? ?????????//?捕捉PageLayoutControl的焦點(diǎn)圖的ITransformEvents事件 ???????? visBoundsUpdatedE =?new???????? ITransformEvents_VisibleBoundsUpdatedEventHandler(OnVisibleBoundsUpdated); ???????? ((ITransformEvents_Event)activeView.ScreenDisplay ???????????? .DisplayTransformation).VisibleBoundsUpdated += visBoundsUpdatedE; ???????? ?????????//?獲取焦點(diǎn)圖的范圍 m_Envelope = activeView.Extent; //?后面是加載地圖文檔的代碼 //?…… 6.在設(shè)計(jì)模式下顯示窗體并從屬性窗中選擇axMapControl1,顯示axMapControl事件。雙擊OnAfterDraw向代碼窗口中增加事件處理。?????? 7.向axMapControl1_OnAfterDraw事件處理中增加以下代碼,使用前面創(chuàng)建的符號(hào)繪制MapControl顯示邊框。?????? privatevoid?axMapControl1_OnAfterDraw(object?sender, ESRI.ArcGIS.MapControl.IMapControlEvents2_OnAfterDrawEvent e) ???? { ?????????if?( m_Envelope ==?null) ???????? { ?????????????return; ???????? } ? ?????????//?如果前景狀態(tài)被重繪 ???????? esriViewDrawPhase viewDrawPhase = (esriViewDrawPhase)e.viewDrawPhase; ?????????if?( viewDrawPhase == esriViewDrawPhase.esriViewForeground ) ???????? { ???????????? IGeometry geometry = m_Envelope; ???????????? axMapControl1.DrawShape(geometry,?ref?m_FillSymbol); ???????? } } 生成并運(yùn)行應(yīng)用程序。使用你先前已經(jīng)加好的地圖導(dǎo)航工具改變PageLayoutControl中焦點(diǎn)地圖的范圍。新的范圍被繪制在MapControl上。 (十)創(chuàng)建自定義工具 創(chuàng)建協(xié)同MapControl和PageLayoutControl一起運(yùn)作的自定義命令和工具,與你或許已經(jīng)做過的創(chuàng)建ESRI ArcMap應(yīng)用程序命令非常相似。你將創(chuàng)建一個(gè)在PageLayoutControl鼠標(biāo)點(diǎn)擊位置添加包含當(dāng)天日期的文本元素的自定義工具。不管用何種方法,創(chuàng)建同MapControl和ToolbarControl協(xié)作的命令與同PageLayoutControl一樣。 這個(gè)自定義工具的相關(guān)代碼與其他本方案源代碼一樣很有用。如果你想要直接使用自定義命令,而不自己創(chuàng)建它,請(qǐng)直接到第24步。 1.從新建項(xiàng)目對(duì)話框創(chuàng)建一個(gè)新的Visual C#?“類庫”項(xiàng)目。?????? 2.將項(xiàng)目命名為“Commands”,并選擇保存位置存貯之。?????? 3.單擊項(xiàng)目菜單并選擇“添加引用(R)…”。?????? 4.在添加引用對(duì)話框中,復(fù)選“ESRI.ArcGIS.Carto”,“ESRI.ArcGIS.Display”,“ESRI.ArcGIS.Geometry”,“ESRI.ArcGIS.System”,“ESRI.ArcGIS.SystemUI”,“ESRI.ArcGIS..Utility”和“ESRI.ArcGIS.ControlCommands”。?????? 5.在項(xiàng)目中增加一個(gè)類,名字叫AddDateTool。?????? 6.點(diǎn)擊項(xiàng)目菜單并選擇添加現(xiàn)有項(xiàng),瀏覽樣例源碼目錄并找到date.bmp文件將其加入到你的項(xiàng)目。?????? 7.在解決方案資源管理器中點(diǎn)擊date.bmp在屬性窗口顯示其屬性。改變生成操作屬性為嵌入的資源。這張位圖將被用來作為命令按鈕的外觀。?????? 8.改變AddDateTool的命名空間的名稱為CSharpDotNETCommands。?????? namespace?CSharpDotNETCommands { …… 注:要在Visual Basi .NET中改變命名空間的名稱,則在解決方案資源管理器的項(xiàng)目上點(diǎn)擊右鍵并選擇屬性,在項(xiàng)目屬性頁中選擇常規(guī)并改變根命名空間后,按確定。 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)類修飾。???? publicsealedclass?AddDateTool : BaseTool { …… 注:抽象類是不能被實(shí)例化的類,通常僅包含部分實(shí)現(xiàn)代碼,或者不包含任何實(shí)現(xiàn)代碼。它們與接口密切相關(guān);但與接口有明顯的區(qū)別,也就是說,一個(gè)類可能實(shí)現(xiàn)任意數(shù)量的接口,但它僅能夠從一個(gè)抽象類中繼承。繼承了ESRI BaseTool抽象類,你便可以比直接實(shí)現(xiàn)esriSystemUI ICommand和ITool接口更快速、簡便地創(chuàng)建命令和工具。 密封類修飾說明一個(gè)類不能被繼承。此類的設(shè)計(jì)是為了限制其他類從該類繼承。 11.向AddDateTool類的構(gòu)造函數(shù)中增加下列代碼:???? ????publicsealedclass?AddDateTool : BaseTool ??? { ????????public?AddDateTool() ??????? { ????????????//?獲取程序集中的資源數(shù)組 ????????????string[] res = GetType().Assembly.GetManifestResourceNames(); ? ??? ????????//?設(shè)置工具屬性 ????????????base.m_bitmap =?new?System.Drawing.Bitmap( ??????????????? GetType().Assembly.GetManifestResourceStream(res[0])); ????????????base.m_caption = "添加日期"; ????????????base.m_category = "CustomCommands"; ????????????base.m_message = "在頁面布局中增加一個(gè)日期元素"; ????????????base.m_name = "CustomCommands_Add Date"; ????????????base.m_toolTip = "添加日期"; ??????? } ??? } 注:類構(gòu)造函數(shù)是一個(gè)當(dāng)類創(chuàng)建時(shí)被調(diào)用的方法。它可以用來初始化類成員變量。構(gòu)造函數(shù)名與類名相同;與其他方法不同的是它沒有返回類型。 程序中只個(gè)別地替換實(shí)現(xiàn)了位圖、標(biāo)題、目錄、名稱、消息和提示方法,你可以設(shè)置從這此方法返回的值,且依賴于BaseTool類為這此方法提供的實(shí)現(xiàn)。其它的成員保留BaseTool類返回的默認(rèn)值。 12.向AddDateTool類增加下列成員變量。???? publicsealedclass?AddDateTool : BaseTool { ????// HookHelper對(duì)象處理通過OnCreate事件的回調(diào) ????private?IHookHelper m_HookHelper =?new?HookHelperClass(); ?????????…… 13.在類視圖窗口中,定位到BaseCommand類的OnCreate方法,右鍵點(diǎn)擊之顯示上下文菜單。選擇增加,然后重載并增加該方法至代碼窗口。???? 14.在重載的OnCreate方法中增加以下代碼。???? ?????publicoverridevoid?OnCreate(object?hook) ???? { ???????? m_HookHelper.Hook = hook; ???? } 注:要在Visual Basic .NET中重載屬性和方法,從代碼窗口頂部的“Class Name”組合框中選擇“Overrides”,從“Method Name”組合框中選擇屬性或方法。 15.在類視圖中定位到BaseCommand類的Enabled屬性并在其上點(diǎn)擊右鍵顯示上下文菜單。選擇添加,然后點(diǎn)重寫增加該屬性至代碼窗口。???? 16.增加以下代碼,重寫B(tài)aseTool類的默認(rèn)Enabled值。???? ?????publicoverridebool?Enabled ???? { ?????????get ???????? { ?????????????//?設(shè)置使能屬性 ?????????????if?( m_HookHelper.ActiveView !=?null?) ???????????? { ?????????????????returntrue; ???????????? } ?????????????else ???????????? { ?????????????????returnfalse; ???????????? } ???????? } ???? } 注:ICommand_OnCreate事件向命令工作的應(yīng)用程序傳送一個(gè)句柄或回調(diào)。在這種情況下,它可以是MapControl,PageLayoutControl或ToolbarControl。除向OnCreate事件增加代碼外,你可以使用HookHelper判斷傳向命令的回調(diào)類型。命令或工具需要知道如何處理傳送的回調(diào),所以必須對(duì)ArcGIS Control傳送的類型作檢查。HookHelper用來控件回調(diào)并返回ActiveView忽略的回調(diào)類型(MapControl、PageLayoutControl和ToolbarControl都是這樣)。 17.在類視圖中定位到BaseTool基類的OnMouseDown方法,并在其上點(diǎn)擊右鍵顯示上下文菜單。選擇添加,然后重載并增加該屬性至代碼窗口。???? 18.增加下列代碼,重載BaseTool類實(shí)現(xiàn)的默認(rèn)OnMouseDown函數(shù)。???? ?????publicoverridevoid?OnMouseDown(int?Button,?int?Shift,?int?X,?int?Y) ???? { ?????????// TODO:?添加 AddDateTool.OnMouseDown 實(shí)現(xiàn) ?????????base.OnMouseDown (Button, Shift, X, Y); ? ?????????//?獲取活動(dòng)視圖 ???????? IActiveView activeView = m_HookHelper.ActiveView; ? ?????????//?創(chuàng)建新的文本元素 ???????? ITextElement textElement =?new?TextElementClass(); ?????????//?創(chuàng)建文本符號(hào) ???????? ITextSymbol textSymbol =?new?TextSymbolClass(); ???????? textSymbol.Size = 25; ? ?????????//?設(shè)置文本元素屬性 ???????? textElement.Symbol = textSymbol; ???????? textElement.Text = DateTime.Now.ToShortDateString(); ? ?????????//?對(duì)IElementQI ???????? IElement element = (IElement) textElement; ?????????//?創(chuàng)建頁點(diǎn) ???????? IPoint point =?new?PointClass(); ???????? point = activeView.ScreenDisplay.DisplayTransformation.ToMapPoint(X, Y); ??????? ?????????//?設(shè)置元素圖形 ???????? element.Geometry = point; ? ?????????//?增加元素到圖形繪制容器 ???????? activeView.GraphicsContainer.AddElement(element, 0); ?????????//?刷新圖形 ???????? activeView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, ?????????????null,?null); ???? } 19.期望自定義命令是一個(gè)COM類;因此,你必須指定你所創(chuàng)建的.NET類也成為一個(gè)COM類,它是通過創(chuàng)建一個(gè)COM可調(diào)用包裝(callable wrapper)實(shí)現(xiàn)的。在解決方案資源管理器窗口中,在Commands項(xiàng)目上右擊鼠標(biāo)鍵并從上下文菜單中選擇屬性。?????ArcGIS Engine 20.在項(xiàng)目屬性頁對(duì)話框中選擇配置屬性;并點(diǎn)擊生成。在右面的面板中,改變?yōu)椤盀镃om Interop注冊(cè)”為True,點(diǎn)確定。???? 注:設(shè)置“為Com Interop注冊(cè)”屬性為True會(huì)調(diào)用程序集注冊(cè)工具(Regasm.exe)。這將增加客戶端期望找到的類信息。 如果“為Com Interop注冊(cè)”屬性設(shè)為False,則使項(xiàng)目不要是一個(gè)C#類庫類型。 21.在AddDateTool類的代碼編寫窗口的AddDateTool類聲明的開始位置增加下列代碼,指定COM需要的屬性。???? ??? [ClassInterface(ClassInterfaceType.None)] ??? [Guid("D880184E-AC81-47E5-B363-781F4DC4528F")] ????注:新的GUID可能通過Visual Studio .NET中的GuidGen.exe實(shí)用工具生成,或者從工具菜單中選擇創(chuàng)建GUID。GUID應(yīng)該像上面的格式并不包含大括號(hào)(curly braces)。 22.向AddDateTool類成員變量的后面增加下列代碼。此代碼定義了一些函數(shù),這些函數(shù)使用目錄實(shí)用工具向ESRI控件命令(ESRI Control Commands)組件目錄注冊(cè)和取消注冊(cè)AddDateTool類。???? ?????//?在“ESRI Controls Commands”組件目錄注冊(cè) ???? #region?Component Category Registration ???? [ComRegisterFunction()] ???? [ComVisible(false)] ?????staticvoid?RegisterFunction(String sKey) ???? { ?????????string?fullKey = sKey.Remove(0, 18) + @"/nImplemented Categories"; ???????? Microsoft.Win32.RegistryKey regKey = ???????????? Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(fullKey,?true); ?????????if?(regKey !=?null) ???????? { ???????????? regKey.CreateSubKey("{B284D891-22EE-4F12-A0A9-B1DDED9197F4}"); ???????? } ???? } ? ???? [ComUnregisterFunction()] ???? [ComVisible(false)] ?????staticvoid?UnregisterFunction(String sKey) ???? { ?????????string?fullKey = sKey.Remove(0, 18) + @"/Implemented Categories"; ???????? Microsoft.Win32.RegistryKey regKey = ???????????? Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(fullKey,?true); ?????????if?(regKey !=?null) ???????? { ???????????? regKey.DeleteSubKey("{B284D891-22EE-4F12-A0A9-B1DDED9197F4}"); ???????? } ???? } ???? #endregion 23.生成工程。???? 24.在方案開始創(chuàng)建的Visual Studio .NET?“Windows應(yīng)用程序”項(xiàng)目中,增加地圖導(dǎo)航命令代碼的后面增加以下代碼。???? ?????privatevoid?Form1_Load(object?sender, System.EventArgs e) ???? { ???????? //?前面是命令導(dǎo)航代碼……?????????? ?????????//?添加自定義日期工具 ???????? progID = "CSharpDotNETCommands.AddDateTool"; ???????? axToolbarControl1.AddItem(progID, -1, -1,?true, 0, ???????????? esriCommandStyles.esriCommandStyleIconAndText); //?后面是ToolbarMenu相關(guān)代碼…… } 25.生成并運(yùn)行應(yīng)用程序,使用添加日期工具向PageLayoutControl上增加一個(gè)包含當(dāng)天日期的文本元素。???? (十一)自定義ToolbarControl 同在Form_Load事件中向ToolbarControl控件增加ArcGIS Engine命令和工具一樣,你也可以使用定制對(duì)話框和自定義ToolbarControl的方式添加命令和工具。要實(shí)現(xiàn)它,就要將ToolbarControl置為定制模式并顯示定制對(duì)話框。 1.向類中增加下列成員變量:?????? …… ?????private?ITransformEvents_VisibleBoundsUpdatedEventHandler ???????? visBoundsUpdatedE;??????????// PageLayoutControl的焦點(diǎn)圖事件 ? ?????private?ICustomizeDialog m_CustomizeDialog =?new ???????? CustomizeDialogClass();?// CurtomizeDialog被ToolbarControl使用 ?????private?ICustomizeDialogEvents_OnStartDialogEventHandler ???????? startDialogE;?// CustomizeDialog啟動(dòng)事件 ?????private?ICustomizeDialogEvents_OnCloseDialogEventHandler ???????? closeDialogE;?// CustomizeDialog關(guān)閉事件 …… 注:Visual Studio .NET提供了當(dāng)程序集對(duì)COM interop開放時(shí)執(zhí)行的函數(shù)在系統(tǒng)中被注冊(cè)和取消注冊(cè)的功能。這就允許你在定制對(duì)話框可能找到的組件目錄中注冊(cè)你自己的類。 2.創(chuàng)建一個(gè)叫CreateCustomizeDialog的新函數(shù),這個(gè)函數(shù)是你通過增加如下代碼創(chuàng)建自定義對(duì)話框的地方。?????? ?????privatevoid?CreateCustomizeDialog() ???? { ?????????//?設(shè)置自定義對(duì)話框事件 ???????? startDialogE =?new ???????????? ICustomizeDialogEvents_OnStartDialogEventHandler(OnStartDialog); ???????? ((ICustomizeDialogEvents_Event)m_CustomizeDialog).OnStartDialog += ???????????? startDialogE; ???????? closeDialogE =?new ???????????? ICustomizeDialogEvents_OnCloseDialogEventHandler(OnCloseDialog); ???????? ((ICustomizeDialogEvents_Event)m_CustomizeDialog).OnCloseDialog += ???????????? closeDialogE; ? ?????????//?設(shè)置標(biāo)題 ???????? m_CustomizeDialog.DialogTitle = "自定義ToolbarControl項(xiàng)目"; ?????????//?顯示“從文件添加”按鈕 ???????? m_CustomizeDialog.ShowAddFromFile =?true; ?????????//?設(shè)置將增加新項(xiàng)目的ToolbarControl ???????? m_CustomizeDialog.SetDoubleClickDestination(axToolbarControl1); } 注:設(shè)置ComVisible屬性為false確保此方法不能被COM客戶端直接調(diào)用。當(dāng)程序集通過COM注冊(cè)時(shí),它不影響被調(diào)用的方法。 3.在Form_Load事件中調(diào)用CreateOverviewSymbol子過程以前調(diào)用CreateCustomizeDialog函數(shù)。?????? ?????privatevoid?Form1_Load(object?sender, System.EventArgs e) ???? { ?????????//?當(dāng)縮放時(shí)禁止重繪 ?????????this.SetStyle(ControlStyles.EnableNotifyMessage,?true); ? ?????????//?為ToolbarControl創(chuàng)建自定義對(duì)話框 CreateCustomizeDialog(); …… } 4.在窗體上增加一個(gè)名叫“chkCustomize”的復(fù)選框,并將標(biāo)題命名為“定制”。?????? 5.在設(shè)計(jì)模式顯示窗體并從屬性窗口選擇chkCustomize控件,顯示chkCustomize事件。在CheckedChanged事件上雙擊向代碼窗口增加相應(yīng)的事件處理。?????? 6.向chkCustomize_CheckedChanged事件中增加下列代碼。?????? ?????privatevoid?chkCustomize_CheckedChanged(object?sender, System.EventArgs e) ???? { ?????????//?顯示或隱藏自定義對(duì)話框 ?????????if?(chkCustomize.Checked ==?false?) ???????? { ???????????? m_CustomizeDialog.CloseDialog(); ???????????? axToolbarControl1.Customize =?false; ???????? } ?????????else ???????? { ???????????? m_CustomizeDialog.StartDialog(axToolbarControl1.hWnd); ???????????? axToolbarControl1.Customize =?true; ???????? } } 7.增加下以下OnStartDialog和OnCloseDialog事件處理函數(shù)。這些函數(shù)將與自定義對(duì)話框打開或關(guān)閉時(shí)觸發(fā)的事件緊密連接。?????? ?????privatevoid?OnStartDialog() ???? { ??????????? axToolbarControl1.Customize =?true;????? ???? } ? ?????privatevoid?OnCloseDialog() ???? { ???????? axToolbarControl1.Customize =?false; ???????? chkCustomize.Checked =?false; } 8.生成并運(yùn)行應(yīng)用程序,選擇定制復(fù)選框使ToolbarControl進(jìn)入自定義模式,并打開自定義對(duì)話框。?????? 9.在自定義ToolbarControl項(xiàng)目對(duì)話框中的左邊目錄(Categories)列表中選擇“Graphic Element”項(xiàng),然后在右邊的命令(Commands)列表中“Select Elements”項(xiàng)上雙擊將其加入到ToolbarControl工具欄中。右鍵點(diǎn)擊ToolbarControl上的任何一個(gè)項(xiàng)目,你可以調(diào)整它的顯示樣式和組合特性。?????? 10.結(jié)束定制應(yīng)用。使用選擇工具移動(dòng)包含日期的文本元素。???? 六、部署 要將應(yīng)用程序成功地部署到另一臺(tái)機(jī)器上,必須為應(yīng)用程序配置協(xié)議。首先,它必須檢查產(chǎn)品協(xié)議是否有效,其次,它必須初始化協(xié)議。如果協(xié)議配置不正確有,應(yīng)用程序?qū)⒉荒苓\(yùn)行。 注:當(dāng)采用ESRI ArcObjects開發(fā)獨(dú)立運(yùn)行的程序時(shí),應(yīng)用程序負(fù)責(zé)檢查并配置協(xié)議選項(xiàng)。它通過實(shí)現(xiàn)CoClass AoInitialize和IAoInitialize接口來支持協(xié)議配置。應(yīng)用程序運(yùn)行時(shí),在任何ESRI ArcObject功能被訪問之前協(xié)議初始化必須先被執(zhí)行。如果初始化失敗將導(dǎo)致應(yīng)用程序錯(cuò)誤。 1.向類中增加下列成員變量。?????? publicclass?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; ? ????????//?應(yīng)用初始化對(duì)象 ????????private?IAoInitialize m_AoInitialize =?new?AoInitializeClass(); ? //?后面是彈出菜單變量聲明代碼 …… 2.在Form_Load事件的最開始位置增加下列代碼。?????? ?????privatevoid?Form1_Load(object?sender, System.EventArgs e) ???? { ?????????//?創(chuàng)建新的AoInitialize對(duì)象 ?????????if?( m_AoInitialize ==?null) ???????? { ???????????? System.Windows.Forms.MessageBox.Show( ???????????????? "初始化失敗,程序不能運(yùn)行!"); ?????????????this.Close(); ???????? } ? ?????????//?判斷產(chǎn)品是否有效 ???????? esriLicenseStatus licenseStatus = (esriLicenseStatus) ???????????? m_AoInitialize.IsProductCodeAvailable( ???????????? esriLicenseProductCode.esriLicenseProductCodeEngine); ?????????if?(licenseStatus == esriLicenseStatus.esriLicenseAvailable ) ???????? { ???????????? licenseStatus = (esriLicenseStatus) ???????????????? m_AoInitialize.Initialize(esriLicenseProductCode.esriLicenseProductCodeEngine); ?????????????if?(licenseStatus != esriLicenseStatus.esriLicenseCheckedOut ) ???????????? { ???????????????? System.Windows.Forms.MessageBox.Show( ???????????????????? "初始化失敗,應(yīng)用程序不能運(yùn)行!"); ?????????????????this.Close(); ???????????? } ???????? } ?????????else ???????? { ???????????? System.Windows.Forms.MessageBox.Show( ???????????????? "ArcGIS Engine產(chǎn)品無效,此程序不能運(yùn)行!"); ?????????????this.Close(); ???????? } ? ?????????//?當(dāng)縮放時(shí)禁止重繪 this.SetStyle(ControlStyles.EnableNotifyMessage,?true); //?后面是創(chuàng)建自定義對(duì)話框的代碼…… …… } 3.在設(shè)計(jì)模式顯示窗體并在屬性窗口選擇Form1,顯示窗體事件。在Closing事件上雙擊向代碼窗口增加事件處理代碼。?????? 4.在Form_Closing事件中增加以下代碼:?????? ?????privatevoid?Form1_Closing(object?sender, System.ComponentModel.CancelEventArgs e) ???? { ?????????//?釋放COM對(duì)象并關(guān)閉AoInitialize對(duì)象 ???????? ESRI.ArcGIS.Utility.COMSupport.AOUninitialize.Shutdown(); ???????? m_AoInitialize.Shutdown(); } 5.在Release模式下生成項(xiàng)目和解決方案。?????? 要將應(yīng)用程序成功地部署到用戶機(jī)器上: l???要將應(yīng)用程序的可執(zhí)行文件和包含自定義命令的動(dòng)態(tài)鏈接庫DLL發(fā)布到用戶機(jī)器上。程序集注冊(cè)工具(RegAsm.exe)必須被用來向注冊(cè)表增加關(guān)于自定義類的信息。 l???用戶機(jī)器上需要安裝有ArcGIS Engine運(yùn)行時(shí)庫和標(biāo)準(zhǔn)ArcGIS Engine協(xié)議。 l???客戶機(jī)上需要安裝Microsoft .NET Framework 1.1。 七、附加資源 下列資源可以幫助你理解和應(yīng)用在本方案中在在的概念和技術(shù)。 l???在ArcGIS Engine開發(fā)工具包中包含了其他可用的文檔:ArcGIS開發(fā)幫助,組件幫助,對(duì)象模型圖表和適合于初學(xué)者的樣例程序。 l???ArcGIS開發(fā)在線——一個(gè)Web站點(diǎn),提供了最新的ArcGIS開發(fā)信息,包括程序樣例和技術(shù)文檔。請(qǐng)?jiān)L問http://arcgisdeveloperonline.esri.com/ l???ESRI在線討論組——Web站點(diǎn),從其他ArcGIS開發(fā)者提供無償援助。請(qǐng)?jiān)L問http://support.esri.com/并點(diǎn)擊用戶論壇頁簽。 l???微軟Visual Studio .NET開發(fā)環(huán)境中的文檔。
轉(zhuǎn)載于:https://www.cnblogs.com/arxive/p/6017418.html
與50位技術(shù)專家面對(duì)面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖
總結(jié)
以上是生活随笔為你收集整理的利用ArcGIS Engine、VS .NET和Windows控件开发GIS应用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。