CArcGISEngine開發(fā)入門教程_第1頁(yè)
CArcGISEngine開發(fā)入門教程_第2頁(yè)
CArcGISEngine開發(fā)入門教程_第3頁(yè)
CArcGISEngine開發(fā)入門教程_第4頁(yè)
CArcGISEngine開發(fā)入門教程_第5頁(yè)
已閱讀5頁(yè),還剩42頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、窗體頂端 C#,ArcGIS Engine開發(fā)入門教程 收藏利用ArcGIS Engine、VS .NET和Windows控件開發(fā)GIS應(yīng)用Dixon整理此過(guò)程說(shuō)明適合那些使用.NET建立和部署應(yīng)用的開發(fā)者,它描述了使用ArcGIS控件建立和部署應(yīng)用的方法和步驟。你可以在下面的目錄下找到相應(yīng)的樣例程序:DeveloperKitSamplesDeveloper_Guide_Scenarios ArcGIS_EngineBuilding_an_ArcGIS_Control_ApplicationMap_Viewer注:ArcGIS樣例程序不包含在ArcGIS Engine開發(fā)工具包“典型”安裝方式

2、中。如果你沒(méi)有安裝它們,則可以重新運(yùn)行開發(fā)工具包安裝向?qū)?,選擇“定制”或“修改”方式,并選擇軟件開發(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)用程序、建立命令行

3、方式的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、Page

4、LayoutControl和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)過(guò)Interop程

5、序集,然后到達(dá)實(shí)際的COM對(duì)象。同樣,也從COM對(duì)象經(jīng)過(guò)Interop程序集到達(dá).NET應(yīng)用程序。每個(gè)ArcGIS Engine控件具有方法、屬性與事件,它們能夠被控件嵌入的容器(如,.NET窗體)訪問(wèn)。每個(gè)控件對(duì)象及其功能可以與其他ESRI ArcObjects和自定義控件組合使用,創(chuàng)建用戶化的客戶應(yīng)用程序。此方案是使用了C#和Visual Basic .NET兩種語(yǔ)言創(chuàng)建,但以下技術(shù)實(shí)現(xiàn)集中傾向于C#方案。許多開發(fā)者可能會(huì)感覺(jué)用Visual Basic .NET更舒服,那是因?yàn)樗麄円呀?jīng)比較熟悉Visual Basic 6.0代碼,然而,對(duì)于Java和C+程序員來(lái)說(shuō),他們將會(huì)覺(jué)得對(duì)C#程序語(yǔ)

6、言的語(yǔ)法更熟悉。無(wú)論你使用哪種開發(fā)環(huán)境,對(duì)于使用ArcGIS控件的好壞既依賴于你的編程環(huán)境技術(shù),也依賴于你所掌握的ArcObjects技術(shù)。在本方案中,使用ToolbarControl、TOCControl、PageLayoutControl和MapControl來(lái)為應(yīng)用程序提供用戶界面。這些ArcGIS控件與其他ArcObjects和ArcGIS Engine命令被開發(fā)者一起使用,用來(lái)創(chuàng)建一個(gè)GIS視窗應(yīng)用。三、設(shè)計(jì)此方案在設(shè)計(jì)時(shí),首先強(qiáng)調(diào)了ArcGIS 控件如何互相之間進(jìn)行交互,其次,向開發(fā)者解釋說(shuō)明了ArcGIS 控件對(duì)象模型的一部分。每個(gè).NET ArcGIS Engine控件包含有一

7、套能夠被嵌入其內(nèi)的窗口即時(shí)訪問(wèn)的屬性頁(yè)。這些屬性些為控件屬性和方法的選擇提供了捷徑,并且允許開發(fā)者不寫任何代碼即可創(chuàng)建一個(gè)應(yīng)用程序。本方案并沒(méi)有使用屬性頁(yè),而是采用寫代碼的方式建立應(yīng)用程序。關(guān)于屬性頁(yè)的更進(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.

8、1及其相應(yīng)協(xié)議。l 熟悉微軟Windows操作系統(tǒng)和Microsoft Visual Studio .NET的工作知識(shí),會(huì)用C#或Visual Basic .NET編程語(yǔ)言。當(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 訪問(wèn)來(lái)自本方案的樣例數(shù)據(jù)和代碼,它位于:DeveloperKitSamplesDeveloper_

9、Guide_Scenarios ArcGIS_EngineBuilding_an_ArcGIS_Control_ApplicationMap_Viewer本方案中使用到的控件和庫(kù)如下:l AxMapControll AxTOCControll AxPageLayoutControll AxToolbarControll ESRI.ArcGIS.Cartol ESRI.ArcGIS.Systeml ESRI.ArcGIS.Displayl ESRI.ArcGIS.SystemUIl ESRI.ArcGIS.Geometryl ESRI.ArcGIS.Utilityl esriMapControl

10、l esriTOCControll esriPageLayoutControll esriToolbarControl五、實(shí)現(xiàn)下面的實(shí)現(xiàn)過(guò)程中提供了你成功完成方案所需所有代碼。假設(shè)你對(duì)于開發(fā)環(huán)境已經(jīng)有了一定的知識(shí),所以下面沒(méi)有逐步地詳細(xì)介紹如何用Microsoft Visual Studio .NET開發(fā)應(yīng)用。(一) 加載ArcGIS控件在你為應(yīng)用程序編寫代碼之前,應(yīng)該先將應(yīng)用程序?qū)⒂玫降腁rcGIS控件和其他ArcGIS Engine庫(kù)引用裝載到開發(fā)環(huán)境之中。1. 啟動(dòng)Visual Studio .NET,并從新建項(xiàng)目對(duì)話框中創(chuàng)建一個(gè)新的Visual C# “Windows應(yīng)用程序”項(xiàng)目。2

11、. 將項(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.D

12、isplay”,“ESRI.ArcGIS.Geometry”,“ESRI.ArcGIS.System”,“ESRI.ArcGIS.SystemUI”,“ESRI.ArcGIS.Utility”。單擊確定。注:對(duì)于ESRI .NET程序集,將通過(guò)具體實(shí)例來(lái)說(shuō)明,并使用.NET框架提供的COM傳送服務(wù)從你的C#項(xiàng)目中調(diào)用ESRI對(duì)象庫(kù)中的實(shí)體對(duì)象。(二) 在容器中嵌入ArcGIS控件在你能夠訪問(wèn)每個(gè)控件的事件、屬性和方法之前,需要將控件嵌入到.NET容器中。一旦將控件嵌入窗體內(nèi),它們將圖形化應(yīng)用程序的用戶界面。1. 在設(shè)計(jì)模式下打開.NET窗體。2. 雙擊工具箱Windows標(biāo)簽欄中的AxMapC

13、ontrol控件,將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 ES

14、RI.ArcGIS.Geometry;using ESRI.ArcGIS.esriSystem;using ESRI.ArcGIS.ToolbarControl;using ESRI.ArcGIS.TOCControl;注:需注意C#是區(qū)分大小寫的。當(dāng)你鍵入“ESRI.”時(shí),智能敏感的自動(dòng)完成功能將允許你通過(guò)按Tab鍵完成下一節(jié)。(三) 加載Map文檔到MapControl與PageLayoutControl 單獨(dú)的數(shù)據(jù)層或者使用ArcMap、ArcGIS桌面應(yīng)用程序產(chǎn)生的圖形文檔,能夠被加載到MapControl和PageLayoutControl中。你可以加載樣例圖形文檔,或者加載你自己的

15、圖形文檔。后面你將增加一個(gè)瀏覽圖形文檔的對(duì)話框。1. 選擇Form_Load事件,并輸入下列代碼(如果你使用你自己的圖形文檔,要替換為正確的文件名):/ 使用相對(duì)路徑向PageLayoutControl加載一個(gè)圖形文檔string filename = .DataArcGIS_Engine_Developer_Guidegulf of st. lawrence.mxd;if ( axPageLayoutControl1.CheckMxFile(filename) )axPageLayoutControl1.LoadMxFile(filename, );2. 在設(shè)計(jì)模式顯示窗體并從屬性窗選擇ax

16、PageLayoutControl1控件,顯示axPageLayoutControl事件。在OnPageLayoutReplaced事件上雙擊向代碼窗口添加該事件的處理函數(shù)。3. 在axPageLayoutControl1_OnPageLayoutReplaced事件中鍵入以下向MapControl加載樣例圖形文檔的代碼。當(dāng)文檔被裝載入PageLayoutControl時(shí)OnPageLayoutReplaced事件將會(huì)被觸發(fā)。private void axPageLayoutControl1_OnPageLayoutReplaced(object sender, ESRI.ArcGIS.Pag

17、eLayoutControl.IPageLayoutControlEvents_OnPageLayoutReplacedEvent e)/ 加載同樣的文檔到MapControlaxMapControl1.LoadMxFile(axPageLayoutControl1.DocumentFilename, null, null);/ 設(shè)置MapControl顯示范圍至數(shù)據(jù)的全局范圍axMapControl1.Extent = axMapControl1.FullExtent;(四) 設(shè)置ToolbarControl與TOCControl控件的綁定控件對(duì)于此應(yīng)用程序,TOCControl和Toolb

18、arControl控件將與PageLayoutControl相互協(xié)作,而不是MapControl。為此PageLayoutControl必須設(shè)置為綁定控件。TOCControl使用綁定的ActiveView顯示圖形、圖層和符號(hào)。而位于ToolbarControl上的任何命令、工具或菜單項(xiàng)會(huì)受綁定控件的顯示影響。1. 在Form_Load事件中的加載文檔代碼的后面鍵入以下紅色部分內(nèi)容:private void Form1_Load(object sender, System.EventArgs e)/ 使用相對(duì)路徑向PageLayoutControl加載一個(gè)圖形文檔string filename

19、 = .DataArcGIS_Engine_Developer_Guidegulf of st. lawrence.mxd;if ( axPageLayoutControl1.CheckMxFile(filename) )axPageLayoutControl1.LoadMxFile(filename, );/ 設(shè)置綁定控件axTOCControl1.SetBuddyControl(axPageLayoutControl1);axToolbarControl1.SetBuddyControl(axPageLayoutControl1);2. 生成并運(yùn)行應(yīng)用程序。圖形文檔被加載到PageLayo

20、utControl,并且TOCControl列出了圖形文檔中的數(shù)據(jù)圖層。使用TOCControl通過(guò)復(fù)選和取消復(fù)選框控制圖層的可見(jiàn)性。默認(rèn)地,圖形文檔的焦點(diǎn)圖(focus map)被裝入MapControl控件。在這種當(dāng)前情況下,ToolbarControl控件顯示是空的,因?yàn)闆](méi)有為它添加任何命令。試著縮放窗體,你會(huì)注意到控件不會(huì)改變尺寸。(五) 處理窗口縮放當(dāng)窗口在運(yùn)行時(shí)進(jìn)行縮放時(shí),PageLayoutControl和MapControl不會(huì)自動(dòng)改變自身的尺寸。要改變控件的尺寸以便它們總是與匹配窗口的范圍,你必須將控件錨定在窗口上。如果PageLayoutControl或MapControl

21、包含大量的數(shù)據(jù),在窗口縮放期間重繪這些數(shù)據(jù)顯得相當(dāng)重要。為了提高執(zhí)行效率,你可以禁止數(shù)據(jù)重繪直到縮放操作完成后再重繪之。在縮放時(shí),可以用一個(gè)可伸縮的位圖來(lái)替代重繪數(shù)據(jù)。1. 在設(shè)計(jì)模式顯示窗體并從屬性窗口中選擇axPageLayoutControl1。單擊Anchor屬性,將axPageLayoutControl1錨定在窗體的頂、左、底和右部。2. 錨定axMapControl控件到窗體的頂、左和底部。3. 在Form_Load事件的開頭增加以下代碼:/ 當(dāng)縮放時(shí)禁止重繪this.SetStyle(ControlStyles.EnableNotifyMessage, true);4. 向類增加

22、以下常量: 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)axMapContr

23、ol1.SuppressResizeDrawing(true, 0);axPageLayoutControl1.SuppressResizeDrawing(true, 0);else if ( m.Msg = WM_EXITSIZEMOVE)axMapControl1.SuppressResizeDrawing(false, 0);axPageLayoutControl1.SuppressResizeDrawing(false, 0);6. 生成并運(yùn)行應(yīng)用程序,試著縮放窗口。注:禁止縮放時(shí)重畫方法是通過(guò)檢查發(fā)送到窗體的Windows消息工作的。當(dāng)窗口開發(fā)縮放時(shí),Windows發(fā)送WM_ENTE

24、RSIZEMOVE窗口消息。此時(shí),我們禁止在MapControl和PageLayoutControl上繪制圖形,而是使用“stretchy bitmap”繪制。當(dāng)Windows發(fā)送WM_EXITSIZEMOVE消息時(shí),窗體結(jié)束縮放,這時(shí)我們?nèi)恐乩L新的范圍。(六) 向ToolbarControl增加命令A(yù)rcGIS Engine提供了120多個(gè)命令和工具,它們與MapControl、PageLayoutControl和ToolbarControl直接相互協(xié)作。這些命令和工具為你提供了大量的經(jīng)常使用的地圖導(dǎo)航、圖形管理、地物選擇等方面的GIS功能。現(xiàn)在將在你的應(yīng)用程序中增加這些命令和工具的一部分

25、。1. 在Form_Load事件中的加載文檔代碼之前添加如下代碼。/ 增加打開檔命令string progID;progID = esriControlToolsGeneric.ControlsOpenDocCommand;axToolbarControl1.AddItem(progID, -1, -1, false, 0,esriCommandStyles.esriCommandStyleIconOnly);/ 增加PageLayout導(dǎo)航命令progID = esriControlToolsPageLayout.ControlsPageZoomInTool;axToolbarControl

26、1.AddItem(progID, -1, -1, true, 0,esriCommandStyles.esriCommandStyleIconOnly);progID = esriControlToolsPageLayout.ControlsPageZoomOutTool;axToolbarControl1.AddItem(progID, -1, -1, true, 0,esriCommandStyles.esriCommandStyleIconOnly);progID = esriControlToolsPageLayout.ControlsPagePanTool;axToolbarCon

27、trol1.AddItem(progID, -1, -1, true, 0,esriCommandStyles.esriCommandStyleIconOnly);progID = esriControlToolsPageLayout.ControlsPageZoomWholePageCommand;axToolbarControl1.AddItem(progID, -1, -1, true, 0,esriCommandStyles.esriCommandStyleIconOnly);progID = esriControlToolsPageLayout.ControlsPageZoomPag

28、eToLastExtentBackCommand;axToolbarControl1.AddItem(progID, -1, -1, true, 0,esriCommandStyles.esriCommandStyleIconOnly);progID = esriControlToolsPageLayout.ControlsPageZoomPageToLastExtentForwardCommand;axToolbarControl1.AddItem(progID, -1, -1, true, 0,esriCommandStyles.esriCommandStyleIconOnly); / 增

29、加地圖導(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.esriComm

30、andStyleIconOnly);progID = esriControlToolsMapNavigation.ControlsMapPanTool;axToolbarControl1.AddItem(progID, -1, -1, true, 0,esriCommandStyles.esriCommandStyleIconOnly);progID = esriControlToolsMapNavigation.ControlsMapFullExtentCommand;axToolbarControl1.AddItem(progID, -1, -1, true, 0,esriCommandS

31、tyles.esriCommandStyleIconOnly);/ 使用相對(duì)路徑向PageLayoutControl加載一個(gè)圖形文檔/ 2. 生成并運(yùn)行應(yīng)用程序?,F(xiàn)在ToolbarControl包含了ArcGIS Engine命令和工具,你可以使用它們導(dǎo)航加載到PageLayoutControl中的圖形文檔。使用頁(yè)面布局命令對(duì)當(dāng)前的頁(yè)面布局進(jìn)行導(dǎo)航控制,要對(duì)存在于數(shù)據(jù)框架中的數(shù)據(jù)進(jìn)行導(dǎo)航則使用地圖命令。利用找開文檔命令可以瀏覽并加載其他的圖形文檔。(七) 給PageLayoutControl添加彈出式菜單與給跟綁定控件協(xié)作的ToolbarControl增加ArcGIS Engine命令一樣,按

32、照前面的步驟,你也可以從ArcGIS Engine命令創(chuàng)建彈出式菜單。下面將向你的應(yīng)用程序中增加與PageLayoutControl協(xié)作的彈出式菜單。當(dāng)在PageLayoutControl可視區(qū)域點(diǎn)擊鼠標(biāo)右鍵的時(shí)候,彈出式菜單將顯示。1. 向類中添加如下的成員變量(紅色部分):public class Form1 : System.Windows.Forms.Formprivate ESRI.ArcGIS.MapControl.AxMapControl axMapControl1;private ESRI.ArcGIS.PageLayoutControl.AxPageLayoutControl

33、 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(

34、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.esriCommandStyleIconAndTe

35、xt);progID = esriControlToolsPageLayout.ControlsPageZoomOutFixedCommand;m_ToolbarMenu.AddItem(progID, -1, -1, false,esriCommandStyles.esriCommandStyleIconAndText);progID = esriControlToolsPageLayout.ControlsPageZoomWholePageCommand;m_ToolbarMenu.AddItem(progID, -1, -1, false,esriCommandStyles.esriCo

36、mmandStyleIconAndText);progID = esriControlToolsPageLayout.ControlsPageZoomPageToLastExtentBackCommand;m_ToolbarMenu.AddItem(progID, -1, -1, true,esriCommandStyles.esriCommandStyleIconAndText);progID = esriControlToolsPageLayout.ControlsPageZoomPageToLastExtentForwardCommand;m_ToolbarMenu.AddItem(pr

37、ogID, -1, -1, false,esriCommandStyles.esriCommandStyleIconAndText);/ 設(shè)置與PageLayoutControl掛接m_ToolbarMenu.SetHook(axPageLayoutControl1);/ 后面是加載圖形文檔的代碼/ 3. 在設(shè)計(jì)模式顯示窗體并從屬性窗口中選擇axPageLayoutControl1,顯示axPageLayoutControl事件。雙擊OnMouseDown事件,向代碼窗口中增加事件處理代碼。4. 在axPageLayoutControl1_OnMouseDown事件中增加如下代碼:privat

38、e void axPageLayoutControl1_OnMouseDown(object sender, ESRI.ArcGIS.PageLayoutControl.IPageLayoutControlEvents_OnMouseDownEvent e)/ 彈出ToolbarMenuif ( e.button = 2)m_ToolbarMenu.PopupMenu(e.x, e.y, axPageLayoutControl1.hWnd);5. 生成并運(yùn)行應(yīng)用程序。在PageLayoutControl的顯示區(qū)域單擊右鍵以顯示彈出菜單,并為頁(yè)面布局導(dǎo)航。 (八) 在TOCControl中控制標(biāo)

39、簽編輯TOCControl默認(rèn)允許用戶自動(dòng)地切換圖層的可見(jiàn)性并改變顯示在目錄表中的名稱。你可以增加代碼防止用戶在編輯名稱時(shí)輸入空的字符串。1. 在Form_Load事件的開始增加下列代碼。private void Form1_Load(object sender, System.EventArgs e)/ 當(dāng)縮放時(shí)禁止重繪this.SetStyle(ControlStyles.EnableNotifyMessage, true);/ 設(shè)置標(biāo)簽編輯為手動(dòng)方式axTOCControl1.LabelEdit = esriTOCControlEdit.esriTOCControlManual;/ 后面

40、是加載文檔代碼/ 2. 在設(shè)計(jì)模式顯示窗體并從屬性窗口選擇AxTOCControl1控件,顯示AxTOCControl事件。雙擊OnEndLabelEdit向代碼窗口添加事件處理函數(shù)。3. 在axTOCControl1_OnEndLabelEdit事件中添加以下代碼:private void axTOCControl1_OnEndLabelEdit(object sender, ESRI.ArcGIS.TOCControl.ITOCControlEvents_OnEndLabelEditEvent e)/ 禁止在編輯標(biāo)簽時(shí)鍵入空字串string newLabel = e.newLabel;if

41、 ( 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)圖)將改變PageLay

42、outControl中焦點(diǎn)地圖的范圍并引起MapControl更新。使用頁(yè)面布局工具導(dǎo)航頁(yè)面布局將改變頁(yè)面布局的范圍(不是PageLayoutControl中的焦點(diǎn)圖的范圍),而MapControl將不更新。1. 向類中增加下列成員變量:public class Form1 : System.Windows.Forms.Formprivate ESRI.ArcGIS.MapControl.AxMapControl axMapControl1;private ESRI.ArcGIS.PageLayoutControl.AxPageLayoutControl axPageLayoutControl

43、1;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)priva

44、te ITransformEvents_VisibleBoundsUpdatedEventHandlervisBoundsUpdatedE;/ PageLayoutControl的焦點(diǎn)圖事件注:聲明的變量visBoundsUpdatedE是一個(gè)托管。托管是一個(gè)類,它能夠擁有對(duì)指定方法的引用,并使它鏈接到一個(gè)特定的事件。在事件和方法之間的鏈接過(guò)程有時(shí)在.NET中被稱作wiring。2. 創(chuàng)建一個(gè)叫CreateOverviewSymbol的新函數(shù)。這個(gè)函數(shù)是創(chuàng)建你將在MapControl中使用的符號(hào)的地方,此符號(hào)是用來(lái)描述PageLayoutControl焦點(diǎn)地圖數(shù)據(jù)范圍的。函數(shù)中增加的代碼如下:

45、private void 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();/

46、設(shè)置填充符號(hào)屬性simpleFillSymbol.Outline = outline;simpleFillSymbol.Style = esriSimpleFillStyle.esriSFSHollow;m_FillSymbol = simpleFillSymbol;3. 從Form_Load事件在TOCControl標(biāo)簽編輯代碼之前調(diào)用CreateOverviewSymbol函數(shù)。private void Form1_Load(object sender, System.EventArgs e)/ 當(dāng)縮放時(shí)禁止重繪this.SetStyle(ControlStyles.EnableNotif

47、yMessage, true);/ 創(chuàng)建MapControl使用的符號(hào)CreateOverviewSymbol();/ 下面是標(biāo)簽編輯處理代碼/ 4. 增加下列OnVisibleBoundsUpdated函數(shù)。此函數(shù)將與地圖范圍改變時(shí)觸發(fā)的事件相連接,并用來(lái)設(shè)置新的地圖可見(jiàn)邊界范圍框。通過(guò)刷新MapControl,你強(qiáng)制它重繪其上顯示的圖形。private void OnVisibleBoundsUpdated(IDisplayTransformation sender, bool sizeChanged)/ 設(shè)置新的可見(jiàn)范圍m_Envelope = sender.VisibleBounds;

48、/ 改變MapControl的前景狀態(tài)axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase,esriViewForeground, null, null);5. PageLayoutControl默認(rèn)的事件接口是IPageLayoutControlEvents。這些事件不告訴我們數(shù)據(jù)邊框內(nèi)的地圖范圍。為此你需要使用PageLayoutControl的焦點(diǎn)地圖的ItransformEvents接口。在PageLayoutControl_OnPageLayoutReplaced事件處理中的加載文檔代碼前面增加以下代碼。private v

49、oid axPageLayoutControl1_OnPageLayoutReplaced(object sender, ESRI.ArcGIS.PageLayoutControl.IPageLayoutControlEvents_OnPageLayoutReplacedEvent e)/ 獲取PageLayoutControl中焦點(diǎn)地圖的IActiveView對(duì)象IActiveView activeView = (IActiveView) axPageLayoutControl1.ActiveView.FocusMap;/ 捕捉PageLayoutControl的焦點(diǎn)圖的ITransform

50、Events事件visBoundsUpdatedE = new ITransformEvents_VisibleBoundsUpdatedEventHandler(OnVisibleBoundsUpdated);(ITransformEvents_Event)activeView.ScreenDisplay.DisplayTransformation).VisibleBoundsUpdated += visBoundsUpdatedE;/ 獲取焦點(diǎn)圖的范圍m_Envelope = activeView.Extent;/ 后面是加載地圖文檔的代碼/ 6. 在設(shè)計(jì)模式下顯示窗體并從屬性窗中選擇ax

51、MapControl1,顯示axMapControl事件。雙擊OnAfterDraw向代碼窗口中增加事件處理。7. 向axMapControl1_OnAfterDraw事件處理中增加以下代碼,使用前面創(chuàng)建的符號(hào)繪制MapControl顯示邊框。private void axMapControl1_OnAfterDraw(object sender, ESRI.ArcGIS.MapControl.IMapControlEvents2_OnAfterDrawEvent e)if ( m_Envelope = null)return;/ 如果前景狀態(tài)被重繪esriViewDrawPhase view

52、DrawPhase = (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和PageLayout

53、Control一起運(yùn)作的自定義命令和工具,與你或許已經(jīng)做過(guò)的創(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# “類庫(kù)”項(xiàng)目。2. 將項(xiàng)目命名為“Commands”,并選擇保存位置存貯之。3. 單擊項(xiàng)目菜單并選擇“添加引用(R)”。4. 在添加引用對(duì)話框中,復(fù)選“ESRI.ArcGIS.Carto”,“ESRI.ArcGI

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論