ARCGIS ENGINE開發(fā)入門筆記_第1頁
ARCGIS ENGINE開發(fā)入門筆記_第2頁
ARCGIS ENGINE開發(fā)入門筆記_第3頁
ARCGIS ENGINE開發(fā)入門筆記_第4頁
ARCGIS ENGINE開發(fā)入門筆記_第5頁
已閱讀5頁,還剩36頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、C#,ArcGIS Engine開發(fā)入門教程利用ArcGIS Engine、VS.NET和Windows控件開發(fā)GIS應用king整理此過程說明適合那些使用.NET建立和部署應用的開發(fā)者,它描述了使用ArcGIS控件建立和部署應用的方法和步驟。你可以在下面的目錄下找到相應的樣例程序:DeveloperKitSamplesDeveloper_Guide_ScenariosArcGIS_EngineBuilding_an_ArcGIS_Control_ApplicationMap_Viewer注:ArcGIS樣例程序不包含在ArcGIS Engine開發(fā)工具包“典型”安裝方式中。如果你沒有安裝它們

2、,則可以重新運行開發(fā)工具包安裝向導,選擇“定制”或“修改”方式,并選擇軟件開發(fā)包下的樣例項進行安裝。一、項目描述利用視窗控件建立應用程序的目標是演示并使你熟悉在微軟Visual Studio.NET API中使用標準ArcGIS 控件開發(fā)和部署GIS應用所需的步聚。本節(jié)中使用了Visual Studio.NET開發(fā)環(huán)境中的MapControl、PageLayoutControl、TOCControl和ToolbarControl等視窗控件。COM、Java和C+程序員應該參考如下章節(jié):利用ActiveX建立應用程序、利用可視化JavaBeans建立應用程序、建立命令行方式的Java應用和建立命

3、令行方式的C+應用。本節(jié)演示了創(chuàng)建查看ArcMap和ArcGIS桌面應用圖形文檔的GIS應用程序的步驟。此節(jié)包含了以下技術:在微軟Visual Studio.NET中加載和嵌入ArcGIS控件。向PageLayoutControl和MapControl中加載圖形文檔。設置ToolbarControl和TOCControl的綁定控件。處理窗口縮放。向ToolbarControl添加ArcGIS Engine命令和工具。創(chuàng)建彈出式菜單在TOCControl中管理標簽編輯在MapControl中繪制圖形。為MapControl、PageLayoutControl和ToolbarControl創(chuàng)建定制

4、工具。用戶化ToolbarControl。在Windows操作系統(tǒng)中部署應用。二、概述本方案使用微軟Visual Studio.NET開發(fā)環(huán)境加以實現(xiàn),并使用了ESRI interop程序集(Interop Assemblies,它服務于被放置在.NET窗體上的、位于.NET窗體控件(.NET Windows Controls中的ArcGIS控件,這些程序集在托管的.NET代碼和非托管的COM代碼之間起了橋梁作用。對COM ArcGIS控件(COMArcGIS Controls成員的引用都要經(jīng)過Interop程序集,然后到達實際的COM對象。同樣,也從COM對象經(jīng)過Interop程序集到達.N

5、ET應用程序。每個ArcGIS Engine控件具有方法、屬性與事件,它們能夠被控件嵌入的容器(如,.NET窗體訪問。每個控件對象及其功能可以與其他ESRI ArcObjects和自定義控件組合使用,創(chuàng)建用戶化的客戶應用程序。此方案是使用了C#和Visual Basic.NET兩種語言創(chuàng)建,但以下技術實現(xiàn)集中傾向于C#方案。許多開發(fā)者可能會感覺用Visual Basic.NET更舒服,那是因為他們已經(jīng)比較熟悉Visual Basic6.0代碼,然而,對于Java和C+程序員來說,他們將會覺得對C#程序語言的語法更熟悉。無論你使用哪種開發(fā)環(huán)境,對于使用ArcGIS控件的好壞既依賴于你的編程環(huán)境技

6、術,也依賴于你所掌握的ArcObjects技術。在本方案中,使用ToolbarControl、TOCControl、PageLayoutControl和MapControl來為應用程序提供用戶界面。這些ArcGIS 控件與其他ArcObjects和ArcGIS Engine命令被開發(fā)者一起使用,用來創(chuàng)建一個GIS視窗應用。三、設計此方案在設計時,首先強調了ArcGIS控件如何互相之間進行交互,其次,向開發(fā)者解釋說明了ArcGIS 控件對象模型的一部分。每個.NET ArcGIS Engine控件包含有一套能夠被嵌入其內的窗口即時訪問的屬性頁。這些屬性些為控件屬性和方法的選擇提供了捷徑,并且允許

7、開發(fā)者不寫任何代碼即可創(chuàng)建一個應用程序。本方案并沒有使用屬性頁,而是采用寫代碼的方式建立應用程序。關于屬性頁的更進一步的信息,請參考ArcGIS開發(fā)幫助(ArcGISDeveloper Help。四、條件需求要順利地完成以下方案,你需要以下條件(對于部署的需求將在后續(xù)的部署章節(jié)涉及到:安裝具有授權文件的ArcGIS Engine開發(fā)工具包(Developer Kit,使之能夠用于開發(fā)。熟悉微軟Windows操作系統(tǒng)和Microsoft Visual Studio.NET的工作知識,會用C#或Visual Basic.NET編程語言。當然,此方案中提供了一些如何在Microsoft Visual

8、 Studio.NET中使用ArcGIS控件的信息,但它不能替代對開發(fā)環(huán)境的培訓。不需要對ESRI其它軟件有足夠的經(jīng)驗,但如果以前對ArcObjects有所接觸并對ArcGIS應用(如,ArcCatalog,ArcMap有一個基本了解,則對于開發(fā)更有利。訪問來自本方案的樣例數(shù)據(jù)和代碼,它位于:DeveloperKitSamplesDeveloper_Guide_ScenariosArcGIS_EngineBuilding_an_ArcGIS_Control_ApplicationMap_Viewer本方案中使用到的控件和庫如下:AxMapControlAxTOCControlAxPageLay

9、outControlAxToolbarControlesriMapControlesriTOCControlesriPageLayoutControlesriToolbarControl五、實現(xiàn)下面的實現(xiàn)過程中提供了你成功完成方案所需所有代碼。假設你對于開發(fā)環(huán)境已經(jīng)有了一定的知識,所以下面沒有逐步地詳細介紹如何用Microsoft Visual Studio.NET開發(fā)應用。(一加載ArcGIS控件在你為應用程序編寫代碼之前,應該先將應用程序將用到的ArcGIS控件和其他ArcGIS Engine庫引用裝載到開發(fā)環(huán)境之中。1.啟動Visual Studio.NET,并從新建項目對話框中創(chuàng)建一個

10、新的Visual C#“Windows應用程序”項目。2.將項目命名為“Controls”,并選擇位置存取該項目。3.在“工具箱”的“Windows窗體”標簽欄中單擊右鍵,然后從上下文菜單中選擇“添加/移除項(I”。4.在“自定義工具箱”中選擇“.NET Framework組件”,并復選“AxMapControl”,“AxPageLayoutControl”,“AxTOCControl”和“AxToolbarControl”,單擊確定按鈕。這樣所選擇的控件將顯示在工具箱的Windows窗體標簽欄中。5.單擊項目菜單,并選擇“添加引用(R”。注:對于ESRI.NET程序集,將通過具體實例來說明,

11、并使用.NET框架提供的COM傳送服務從你的C#項目中調用ESRI對象庫中的實體對象。(二在容器中嵌入ArcGIS控件在你能夠訪問每個控件的事件、屬性和方法之前,需要將控件嵌入到.NET容器中。一旦將控件嵌入窗體內,它們將圖形化應用程序的用戶界面。2.雙擊工具箱Windows標簽欄中的AxMapControl控件,將MapControl加入到窗體上。3.再將AxPageLayoutControl、AxTOCControl和AxToolbarControl如上添加到窗體中。4.重新調整窗體上各個控件的大小和位置,調整結果如下所示。5.在窗體上雙擊顯示窗體代碼窗口,在代碼窗口的頂部增加“using

12、”命令:using System;/ArcGIS Engine引用注:需注意C#是區(qū)分大小寫的。當你鍵入“ESRI.”時,智能敏感的自動完成功能將允許你通過按Tab鍵完成下一節(jié)。(三加載Map文檔到MapControl與PageLayoutControl單獨的數(shù)據(jù)層或者使用ArcMap、ArcGIS桌面應用程序產(chǎn)生的圖形文檔,能夠被加載到MapControl和PageLayoutControl中。你可以加載樣例圖形文檔,或者加載你自己的圖形文檔。后面你將增加一個瀏覽圖形文檔的對話框。1.選擇Form_Load事件,并輸入下列代碼(如果你使用你自己的圖形文檔,要替換為正確的文件名:/使用相對路徑

13、向PageLayoutControl加載一個圖形文檔if(axPageLayoutControl1.CheckMxFile(filenameaxPageLayoutControl1.LoadMxFile(filename,;2.在設計模式顯示窗體并從屬性窗選擇axPageLayoutControl1控件,顯示axPageLayoutControl事件。在OnPageLayoutReplaced事件上雙擊向代碼窗口添加該事件的處理函數(shù)。3.在axPageLayoutControl1_OnPageLayoutReplaced事件中鍵入以下向MapControl加載樣例圖形文檔的代碼。當文檔被裝載入

14、PageLayoutControl時OnPageLayoutReplaced事件將會被觸發(fā)。private void axPageLayoutControl1_OnPageLayoutReplaced(object sender,/加載同樣的文檔到MapControlaxMapControl1.LoadMxFile(axPageLayoutControl1.DocumentFilename,null,null;/設置MapControl顯示范圍至數(shù)據(jù)的全局范圍axMapControl1.Extent=axMapControl1.FullExtent;(四設置ToolbarControl與TOC

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

16、youtControl加載一個圖形文檔if(axPageLayoutControl1.CheckMxFile(filenameaxPageLayoutControl1.LoadMxFile(filename,;/設置綁定控件axTOCControl1.SetBuddyControl(axPageLayoutControl1;axToolbarControl1.SetBuddyControl(axPageLayoutControl1;2.生成并運行應用程序。圖形文檔被加載到PageLayoutControl,并且TOCControl列出了圖形文檔中的數(shù)據(jù)圖層。使用TOCControl通過復選和取

17、消復選框控制圖層的可見性。默認地,圖形文檔的焦點圖(focus map被裝入MapControl控件。在這種當前情況下,ToolbarControl控件顯示是空的,因為沒有為它添加任何命令。試著縮放窗體,你會注意到控件不會改變尺寸。(五處理窗口縮放當窗口在運行時進行縮放時,PageLayoutControl和MapControl不會自動改變自身的尺寸。要改變控件的尺寸以便它們總是與匹配窗口的范圍,你必須將控件錨定在窗口上。如果PageLayoutControl或MapControl包含大量的數(shù)據(jù),在窗口縮放期間重繪這些數(shù)據(jù)顯得相當重要。為了提高執(zhí)行效率,你可以禁止數(shù)據(jù)重繪直到縮放操作完成后再重

18、繪之。在縮放時,可以用一個可伸縮的位圖來替代重繪數(shù)據(jù)。1.在設計模式顯示窗體并從屬性窗口中選擇axPageLayoutControl1。單擊Anchor屬性,將axPageLayoutControl1錨定在窗體的頂、左、底和右部。2.錨定axMapControl控件到窗體的頂、左和底部。3.在Form_Load事件的開頭增加以下代碼:/當縮放時禁止重繪this.SetStyle(ControlStyles.EnableNotifyMessage,true;4.向類增加以下常量:/private const int WM_ENTERSIZEMOVE=0x231;private const int

19、 WM_EXITSIZEMOVE=0x232;/5.向重載的OnNotifyMessage方法中增加下列代碼:protected override void OnNotifyMessage(Message mbase.OnNotifyMessage(m;/以下為手工添加的代碼if(m.Msg=WM_ENTERSIZEMOVEaxMapControl1.SuppressResizeDrawing(true,0;axPageLayoutControl1.SuppressResizeDrawing(true,0;else if(m.Msg=WM_EXITSIZEMOVEaxMapControl1.S

20、uppressResizeDrawing(false,0;axPageLayoutControl1.SuppressResizeDrawing(false,0;6.生成并運行應用程序,試著縮放窗口。注:禁止縮放時重畫方法是通過檢查發(fā)送到窗體的Windows消息工作的。當窗口開發(fā)縮放時,Windows發(fā)送WM_ENTERSIZEMOVE窗口消息。此時,我們禁止在MapControl和PageLayoutControl上繪制圖形,而是使用“stretchy bitmap”繪制。當Windows發(fā)送WM_EXITSIZEMOVE消息時,窗體結束縮放,這時我們全部重繪新的范圍。(六向ToolbarCo

21、ntrol增加命令ArcGIS Engine提供了120多個命令和工具,它們與MapControl、PageLayoutControl和ToolbarControl直接相互協(xié)作。這些命令和工具為你提供了大量的經(jīng)常使用的地圖導航、圖形管理、地物選擇等方面的GIS功能。現(xiàn)在將在你的應用程序中增加這些命令和工具的一部分。1.在Form_Load事件中的加載文檔代碼之前添加如下代碼。/增加打開檔命令string progID;progID=esriControlToolsGeneric.ControlsOpenDocCommand; axToolbarControl1.AddItem(progID,-

22、1,-1,false,0,esriCommandStyles.esriCommandStyleIconOnly;/增加PageLayout導航命令progID=esriControlToolsPageLayout.ControlsPageZoomInTool; axToolbarControl1.AddItem(progID,-1,-1,true,0,esriCommandStyles.esriCommandStyleIconOnly;progID=esriControlToolsPageLayout.ControlsPageZoomOutTool; axToolbarControl1.Add

23、Item(progID,-1,-1,true,0,esriCommandStyles.esriCommandStyleIconOnly;progID=esriControlToolsPageLayout.ControlsPagePanTool; axToolbarControl1.AddItem(progID,-1,-1,true,0,esriCommandStyles.esriCommandStyleIconOnly;progID=esriControlToolsPageLayout.ControlsPageZoomWholePageCommand; axToolbarControl1.Ad

24、dItem(progID,-1,-1,true,0,esriCommandStyles.esriCommandStyleIconOnly;progID=esriControlToolsPageLayout.ControlsPageZoomPageToLastExtentBackCommand; axToolbarControl1.AddItem(progID,-1,-1,true,0,esriCommandStyles.esriCommandStyleIconOnly;progID=esriControlToolsPageLayout.ControlsPageZoomPageToLastExt

25、entForwardCommand; axToolbarControl1.AddItem(progID,-1,-1,true,0,esriCommandStyles.esriCommandStyleIconOnly;/增加地圖導航命令progID=esriControlToolsMapNavigation.ControlsMapZoomInTool;axToolbarControl1.AddItem(progID,-1,-1,true,0,esriCommandStyles.esriCommandStyleIconOnly;progID=esriControlToolsMapNavigatio

26、n.ControlsMapZoomOutTool;axToolbarControl1.AddItem(progID,-1,-1,true,0,esriCommandStyles.esriCommandStyleIconOnly;progID=esriControlToolsMapNavigation.ControlsMapPanTool;axToolbarControl1.AddItem(progID,-1,-1,true,0,esriCommandStyles.esriCommandStyleIconOnly;progID=esriControlToolsMapNavigation.Cont

27、rolsMapFullExtentCommand; axToolbarControl1.AddItem(progID,-1,-1,true,0,esriCommandStyles.esriCommandStyleIconOnly;/使用相對路徑向PageLayoutControl加載一個圖形文檔/2.生成并運行應用程序?,F(xiàn)在ToolbarControl包含了ArcGIS Engine命令和工具,你可以使用它們導航加載到PageLayoutControl中的圖形文檔。使用頁面布局命令對當前的頁面布局進行導航控制,要對存在于數(shù)據(jù)框架中的數(shù)據(jù)進行導航則使用地圖命令。利用找開文檔命令可以瀏覽并加載其他

28、的圖形文檔。(七給PageLayoutControl添加彈出式菜單與給跟綁定控件協(xié)作的ToolbarControl增加ArcGIS Engine命令一樣,按照前面的步驟,你也可以從ArcGIS Engine命令創(chuàng)建彈出式菜單。下面將向你的應用程序中增加與PageLayoutControl協(xié)作的彈出式菜單。當在PageLayoutControl可視區(qū)域點擊鼠標右鍵的時候,彈出式菜單將顯示。1.向類中添加如下的成員變量(紅色部分:private IToolbarMenu m_ToolbarMenu=new ToolbarMenuClass(;/彈出式菜單/2.在Form_Load事件中向Toolb

29、arControl增加命令代碼的后面加載文檔代碼的前面增加如下代碼。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,fal

30、se,esriCommandStyles.esriCommandStyleIconAndText;progID=esriControlToolsPageLayout.ControlsPageZoomOutFixedCommand;m_ToolbarMenu.AddItem(progID,-1,-1,false,esriCommandStyles.esriCommandStyleIconAndText;progID=esriControlToolsPageLayout.ControlsPageZoomWholePageCommand;m_ToolbarMenu.AddItem(progID,-1

31、,-1,false,esriCommandStyles.esriCommandStyleIconAndText;progID=esriControlToolsPageLayout.ControlsPageZoomPageToLastExtentBackCommand;m_ToolbarMenu.AddItem(progID,-1,-1,true,esriCommandStyles.esriCommandStyleIconAndText;progID=esriControlToolsPageLayout.ControlsPageZoomPageToLastExtentForwardCommand

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

33、件中增加如下代碼:private void axPageLayoutControl1_OnMouseDown(object sender,/彈出ToolbarMenuif( e.button=2m_ToolbarMenu.PopupMenu(e.x, e.y,axPageLayoutControl1.hWnd;5.生成并運行應用程序。在PageLayoutControl的顯示區(qū)域單擊右鍵以顯示彈出菜單,并為頁面布局導航。(八在TOCControl中控制標簽編輯TOCControl默認允許用戶自動地切換圖層的可見性并改變顯示在目錄表中的名稱。你可以增加代碼防止用戶在編輯名稱時輸入空的字符串。1.

34、在Form_Load事件的開始增加下列代碼。private void Form1_Load(object sender,System.EventArgs e/當縮放時禁止重繪this.SetStyle(ControlStyles.EnableNotifyMessage,true;/設置標簽編輯為手動方式axTOCControl1.LabelEdit=esriTOCControlEdit.esriTOCControlManual;/后面是加載文檔代碼/2.在設計模式顯示窗體并從屬性窗口選擇AxTOCControl1控件,顯示AxTOCControl事件。雙擊OnEndLabelEdit向代碼窗口

35、添加事件處理函數(shù)。3.在axTOCControl1_OnEndLabelEdit事件中添加以下代碼:/禁止在編輯標簽時鍵入空字串string newLabel=e.newLabel;if(newLabel.Trim(=e.canEdit=false;4.生成并生成應用程序。編輯TOCControl控件的地圖、圖層、標題或圖例類的標簽,在其上點擊一次,然后再點一次調用標簽編輯。試著用空字串替代標簽。在編輯期間,你可以隨時使用鍵盤上的ESC鍵取消編輯。(九在MapControl上繪制圖形你可以將MapControl作為縮略圖窗體使用,并在其上繪制顯示PageLayoutControl內的焦點地圖的

36、當前范圍。當你瀏覽PageLayoutControl數(shù)據(jù)框架內的數(shù)據(jù)時,你將看到縮略圖窗口也進行了更新。注:使用地圖導航工具導航焦點圖(活動圖將改變PageLayoutControl中焦點地圖的范圍并引起MapControl更新。使用頁面布局工具導航頁面布局將改變頁面布局的范圍(不是PageLayoutControl中的焦點圖的范圍,而MapControl將不更新。1.向類中增加下列成員變量:private IToolbarMenu m_ToolbarMenu=new ToolbarMenuClass(;/彈出式菜單private IEnvelope m_Envelope;/MapContro

37、l繪制的范圍private Object m_FillSymbol;/在MapControl上繪制范圍使用的符號private ITransformEvents_VisibleBoundsUpdatedEventHandlervisBoundsUpdatedE;/PageLayoutControl的焦點圖事件注:聲明的變量visBoundsUpdatedE是一個托管。托管是一個類,它能夠擁有對指定方法的引用,并使它鏈接到一個特定的事件。在事件和方法之間的鏈接過程有時在.NET中被稱作wiring。2.創(chuàng)建一個叫CreateOverviewSymbol的新函數(shù)。這個函數(shù)是創(chuàng)建你將在MapCont

38、rol中使用的符號的地方,此符號是用來描述PageLayoutControl焦點地圖數(shù)據(jù)范圍的。函數(shù)中增加的代碼如下: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 simpleFi

39、llSymbol=new SimpleFillSymbolClass(;/設置填充符號屬性simpleFillSymbol.Outline=outline;simpleFillSymbol.Style=esriSimpleFillStyle.esriSFSHollow;m_FillSymbol=simpleFillSymbol;3.從Form_Load事件在TOCControl標簽編輯代碼之前調用CreateOverviewSymbol函數(shù)。private void Form1_Load(object sender,System.EventArgs e/當縮放時禁止重繪this.SetStyl

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

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

42、eLayoutReplaced(object sender,/獲取PageLayoutControl中焦點地圖的IActiveView對象IActiveView activeView=(IActiveView/捕捉PageLayoutControl的焦點圖的ITransformEvents事件visBoundsUpdatedE=new ITransformEvents_VisibleBoundsUpdatedEventHandler(OnVisibleBoundsUpdated;(ITransformEvents_EventactiveView.ScreenDisplay.DisplayTra

43、nsformation.VisibleBoundsUpdated+=visBoundsUpdatedE;/獲取焦點圖的范圍m_Envelope=activeView.Extent;/后面是加載地圖文檔的代碼/6.在設計模式下顯示窗體并從屬性窗中選擇axMapControl1,顯示axMapControl事件。雙擊OnAfterDraw向代碼窗口中增加事件處理。7.向axMapControl1_OnAfterDraw事件處理中增加以下代碼,使用前面創(chuàng)建的符號繪制MapControl顯示邊框。if(m_Envelope=nullreturn;/如果前景狀態(tài)被重繪esriViewDrawPhase

44、viewDrawPhase=(esriViewDrawPhasee.viewDrawPhase;if(viewDrawPhase=esriViewDrawPhase.esriViewForegroundIGeometry geometry=m_Envelope;axMapControl1.DrawShape(geometry,ref m_FillSymbol;生成并運行應用程序。使用你先前已經(jīng)加好的地圖導航工具改變PageLayoutControl中焦點地圖的范圍。新的范圍被繪制在MapControl上。(十創(chuàng)建自定義工具創(chuàng)建協(xié)同MapControl和PageLayoutControl一起運作

45、的自定義命令和工具,與你或許已經(jīng)做過的創(chuàng)建ESRI ArcMap應用程序命令非常相似。你將創(chuàng)建一個在PageLayoutControl鼠標點擊位置添加包含當天日期的文本元素的自定義工具。不管用何種方法,創(chuàng)建同MapControl和ToolbarControl協(xié)作的命令與同PageLayoutControl一樣。這個自定義工具的相關代碼與其他本方案源代碼一樣很有用。如果你想要直接使用自定義命令,而不自己創(chuàng)建它,請直接到第24步。1.從新建項目對話框創(chuàng)建一個新的Visual C#“類庫”項目。2.將項目命名為“Commands”,并選擇保存位置存貯之。3.單擊項目菜單并選擇“添加引用(R”。5.在

46、項目中增加一個類,名字叫AddDateTool。6.點擊項目菜單并選擇添加現(xiàn)有項,瀏覽樣例源碼目錄并找到date.bmp文件將其加入到你的項目。用來作為命令按鈕的外觀。8.改變AddDateTool的命名空間的名稱為CSharpDotNETCspace CSharpDotNETCommands注:要在Visual Basi.NET中改變命名空間的名稱,則在解決方案資源管理器的項目上點擊右鍵并選擇屬性,在項目屬性頁中選擇常規(guī)并改變根命名空間后,按確定。9.在AddDateTool類代碼窗口的頂部增加以下引用。using System;10.指定AddDateTool類繼承

47、自ESRI BaseTool抽象類,并增加密封(sealed類修飾。public sealed class AddDateTool:BaseTool注:抽象類是不能被實例化的類,通常僅包含部分實現(xiàn)代碼,或者不包含任何實現(xiàn)代碼。它們與接口密切相關;但與接口有明顯的區(qū)別,也就是說,一個類可能實現(xiàn)任意數(shù)量的接口,但它僅能夠從一個抽象類中繼承。繼承了ESRI BaseTool 抽象類,你便可以比直接實現(xiàn)esriSystemUI ICommand和ITool接口更快速、簡便地創(chuàng)建命令和工具。密封類修飾說明一個類不能被繼承。此類的設計是為了限制其他類從該類繼承。11.向AddDateTool類的構造函數(shù)中

48、增加下列代碼:public sealed class AddDateTool:BaseToolpublic AddDateTool(/獲取程序集中的資源數(shù)組stringres=GetType(.Assembly.GetManifestResourceNames(;/設置工具屬性GetType(.Assembly.GetManifestResourceStream(res0;base.m_caption=添加日期;base.m_category=CustomCommands;base.m_message=在頁面布局中增加一個日期元素;base.m_name=CustomCommands_Add

49、Date;base.m_toolTip=添加日期;注:類構造函數(shù)是一個當類創(chuàng)建時被調用的方法。它可以用來初始化類成員變量。構造函數(shù)名與類名相同;與其他方法不同的是它沒有返回類型。程序中只個別地替換實現(xiàn)了位圖、標題、目錄、名稱、消息和提示方法,你可以設置從這此方法返回的值,且依賴于BaseTool類為這此方法提供的實現(xiàn)。其它的成員保留BaseTool類返回的默認值。12.向AddDateTool類增加下列成員變量。public sealed class AddDateTool:BaseTool/HookHelper對象處理通過OnCreate事件的回調private IHookHelper m_

50、HookHelper=new HookHelperClass(;13.在類視圖窗口中,定位到BaseCommand類的OnCreate方法,右鍵點擊之顯示上下文菜單。選擇增加,然后重載并增加該方法至代碼窗口。14.在重載的OnCreate方法中增加以下代碼。public override void OnCreate(object hookm_HookHelper.Hook=hook;注:要在Visual Basic.NET中重載屬性和方法,從代碼窗口頂部的“Class Name”組合框中選擇“Overrides”,從“Method Name”組合框中選擇屬性或方法。15.在類視圖中定位到Bas

51、eCommand類的Enabled屬性并在其上點擊右鍵顯示上下文菜單。選擇添加,然后點重寫增加該屬性至代碼窗口。16.增加以下代碼,重寫B(tài)aseTool類的默認Enabled值。public override bool Enabledget/設置使能屬性if(m_HookHelper.ActiveView!=nullreturn true;elsereturn false;注:ICommand_OnCreate事件向命令工作的應用程序傳送一個句柄或回調。在這種情況下,它可以是MapControl,PageLayoutControl或ToolbarControl。除向OnCreate事件增加代碼

52、外,你可以使用HookHelper判斷傳向命令的回調類型。命令或工具需要知道如何處理傳送的回調,所以必須對ArcGIS Control傳送的類型作檢查。HookHelper用來控件回調并返回ActiveView忽略的回調類型(MapControl、PageLayoutControl 和ToolbarControl都是這樣。17.在類視圖中定位到BaseTool基類的OnMouseDown方法,并在其上點擊右鍵顯示上下文菜單。選擇添加,然后重載并增加該屬性至代碼窗口。18.增加下列代碼,重載BaseTool類實現(xiàn)的默認OnMouseDown函數(shù)。public override void OnMo

53、useDown(int Button,int Shift,int X,int Y/TODO:添加AddDateTool.OnMouseDown實現(xiàn)base.OnMouseDown(Button,Shift,X,Y;/獲取活動視圖IActiveView activeView=m_HookHelper.ActiveView;/創(chuàng)建新的文本元素ITextElement textElement=new TextElementClass(;/創(chuàng)建文本符號ITextSymbol textSymbol=new TextSymbolClass(;textSymbol.Size=25;/設置文本元素屬性text

54、Element.Symbol=textSymbol;/對IElementQIIElement element=(IElementtextElement;/創(chuàng)建頁點IPoint point=new PointClass(;/設置元素圖形element.Geometry=point;/增加元素到圖形繪制容器/刷新圖形activeView.PartialRefresh(esriViewDrawPhase.esriViewGraphics,null,null;19.ArcGIS Engine期望自定義命令是一個COM類;因此,你必須指定你所創(chuàng)建的.NET類也成為一個COM類,它是通過創(chuàng)建一個COM可調

55、用包裝(callable wrapper實現(xiàn)的。在解決方案資源管理器窗口中,在Commands項目上右擊鼠標鍵并從上下文菜單中選擇屬性。20.在項目屬性頁對話框中選擇配置屬性;并點擊生成。在右面的面板中,改變?yōu)椤盀镃om Interop注冊”為True,點確定。注:設置“為Com Interop注冊”屬性為True會調用程序集注冊工具(Regasm.exe。這將增加客戶端期望找到的類信息。如果“為Com Interop注冊”屬性設為False,則使項目不要是一個C#類庫類型。21.在AddDateTool類的代碼編寫窗口的AddDateTool類聲明的開始位置增加下列代碼,指定COM需要的屬性。ClassInterface(ClassInterfaceType.NoneGuid(D880184E-AC81-47E5-B363-781F4DC4528F22.向AddDateTool類成員變量的后面增加下列代碼。此代碼定義了一些函數(shù),這些函數(shù)使用目錄實用工具向ESRI控件命令(ESRI Control Command

溫馨提示

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

評論

0/150

提交評論