GIS應(yīng)用開發(fā)課件:ArcGIS 應(yīng)用程序框架_第1頁
GIS應(yīng)用開發(fā)課件:ArcGIS 應(yīng)用程序框架_第2頁
GIS應(yīng)用開發(fā)課件:ArcGIS 應(yīng)用程序框架_第3頁
GIS應(yīng)用開發(fā)課件:ArcGIS 應(yīng)用程序框架_第4頁
GIS應(yīng)用開發(fā)課件:ArcGIS 應(yīng)用程序框架_第5頁
已閱讀5頁,還剩155頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

GIS應(yīng)用開發(fā)DevelopingGISApplicationswithArcObjectsusingC#.NETArcGIS應(yīng)用程序框架(6學(xué)時(shí))所有的ArcGIS桌面應(yīng)用程序(ArcMap、ArcCatlog、ArcGlobe、ArcScene)共享一個(gè)相似的應(yīng)用程序框架結(jié)構(gòu)。定制或擴(kuò)展ArcMap的方法,與定制或擴(kuò)展其它ArcGIS桌面應(yīng)用程序如ArcGlobe或ArcCatalog沒有什么不同,盡管它們使用的ArcObjects組件不一樣。ArcGIS桌面應(yīng)用程序框架組件包括:ApplicationandDocumentCommandsandcommandbarsCommandsToolsSubtypedcommands,ToolControlsandMultiItemsToolbarsMenusContextmenusExtensionsStandardextensions

—Theseareloadedwhentheapplicationstarts.Theyareoftenreferredtoasextensions.Just-in-timeextensions

—Thesearedelayloadedbyrequesttoimprovestartupperformance.CustomwindowsDockablewindowsPropertypagesContentsviewsArcObjectsHelpfor.NETdevelopersDevelopingwithArcGISLearningArcObjectsExtendingArcObjectsApplicationframeworkcustomizations2.1Application對(duì)象Application對(duì)象是ArcMap和ArcCatalog等的核心對(duì)象,這個(gè)對(duì)象代表應(yīng)用程序本身,通過這個(gè)對(duì)象可以訪問系統(tǒng)中的其它對(duì)象。每一個(gè)運(yùn)行的ArcGIS桌面應(yīng)用程序都是一個(gè)Application的對(duì)象實(shí)例,Application管理應(yīng)用程序的啟動(dòng)和關(guān)閉、加載擴(kuò)展模塊等。Application類是在Framework庫中定義的,它是應(yīng)用程序的一個(gè)抽象類。在VBA環(huán)境中,Application始終是一個(gè)全局變量,在任何地方都可以直接使用。2.1.1IApplication接口

(ESRI.ArcGIS.Framework)IApplication定義了ArcGIS所有桌面應(yīng)用程序的一般功能。這個(gè)接口管理應(yīng)用程序的Document對(duì)象、應(yīng)用程序擴(kuò)展(extensions)、狀態(tài)條(StatusBar)、模板(Templates)、當(dāng)前工具等,這個(gè)接口還提供了幾個(gè)方法,用于打開、保存和打印文檔,鎖定或解鎖應(yīng)用程序的用戶定制,顯示應(yīng)用程序中的對(duì)話框,關(guān)閉應(yīng)用程序等。

IApplication的屬性、方法在C#環(huán)境下,可用通過以下方法獲得Application對(duì)象:

ImplementationReferenceMethod

andparameterCommand,Tool,andToolControlIApplicationICommand.OnCreate()hookparameterMultiItemcommandIApplicationIMultiItem.OnPopup()hookparameterExtensionIApplicationIExtension.Startup()initializationDataparameterDockablewindowIApplicationIDockableWindowDef.OnCreate()hookparameterIApplicationm_application=hookasIApplication;

ClassesthatimplementIApplicationApplicationClass(esriArcMap)ArcObjects10ArcMap中嵌入Catalog2.1.2IMxApplication接口

(ESRI.ArcGIS.ArcMapUI)這是ArcMap程序特有的接口,用于管理SelectionEnvironment、Display、Paper和Printer等對(duì)象。IMxApplicationCopyToClipboard()方法用于拷貝應(yīng)用程序當(dāng)前視圖到內(nèi)存的剪貼板中,然后可以粘貼到其他應(yīng)用程序如Word中。SelectionEnvironment屬性用于獲取要素選擇集的相關(guān)屬性。ISelectionEnvironmentIMxApplication2IMxApplication3Pausedisplayupdates.publicboolPauseDrawing{get;set;}publicboolShowStatusBar{get;set;}ArcCatalogIGxApplicationArcGlobeIGMxApplicationArcSenceISxApplication2.1.3IWindowPosition接口

(ESRI.ArcGIS.Framework)任何有可視化窗體的類都實(shí)現(xiàn)了IWindowPosition接口,如DockableWindow、CommandBar和各種Application類。這個(gè)接口定義了窗體的尺寸和位置,如width和height確定了窗體的大小,而left和top規(guī)定了窗體的左上角距離屏幕的左上角之間的距離。這個(gè)接口還定義了一個(gè)屬性state,它用于確定程序窗口的形式,如esriWSNormal(正常模式)、esriWSMaximize(最大化模式)、esriWSMinimize(最小化模式)和esriWSFloating(浮動(dòng)模式)四種。2.2Document對(duì)象不同的ArcGIS桌面應(yīng)用程序,使用的文檔對(duì)象也不一樣:ArcMap:MxDocument(IMxDocument、

IDocumentEvents)ArcCatalog:GxDocument(IDocument

、IGxDocumentEvents)ArcScene:SxDocument(ISxDocument、ISxDocumentEvents)ArcGlobe:GMxDocument(IGMxDocument、IGMxDocumentEvents)應(yīng)用程序一次只能有一個(gè)文檔對(duì)象存在。用戶可以通過IApplication.Document來獲取文檔對(duì)象。所有的文檔對(duì)象都實(shí)現(xiàn)了IDocument接口

(ESRI.ArcGIS.Framework),該接口定義了文檔相關(guān)的以下6個(gè)只讀屬性:Accelerators:文檔中定義的加速鍵表;CommandBars:文檔中定義的命令條的集合;ID:文檔ID;Parent:打開這個(gè)文檔的Application對(duì)象;Title:文檔標(biāo)題;Type:文檔類型;VBProject:文檔的VB項(xiàng)目。ConstantValueDescriptionesriDocumentTypeNormal0TheNormaltemplate.esriDocumentTypeTemplate1Thebasetemplate.esriDocumentTypeDocument2Thecurrentdocument.MxDocument

(ESRI.ArcGIS.ArcMapUI)ArcObjects

10

2.2.1IMxDocument接口(ESRI.ArcGIS.ArcMapUI)IMxDocument是MxDocument的默認(rèn)接口,也是最主要的接口。該接口定義的方法如下:Insertsanobjectintothedocument.Displaystheinsertobjectdialog.publicvoidUpdateContents();刷新當(dāng)前內(nèi)容表視圖,該方法其實(shí)是對(duì)IContentsView.Refresh方法的快捷訪問,可以通過IMxDocument.CurrentContentsView獲得當(dāng)前的內(nèi)容視圖。IMxDocument定義的屬性

m_application=hookasIApplication;

IDocumentdocument=m_application.Document;

IMxDocumentmapDocument=documentasIMxDocument;如果通過某種途徑先獲得了文檔對(duì)象mapDocument(IMxDocument)則IDocumentdocument=mapDocumentasIDocument;IApplicationm_application=document.Parent;2.2.2IDocumentDefaultSymbols接口IDocumentDefaultSymbols接口是文檔缺省符號(hào)設(shè)置接口,用于設(shè)置缺省顏色、符號(hào)。

2.2.3IDocumentEvents接口IDocumentEvents是MxDocument對(duì)象的一個(gè)外向事件接口,使用這個(gè)接口可以監(jiān)聽與地圖文檔對(duì)象有關(guān)的事件,如NewDocument事件,CloseDocument事件等。在C#環(huán)境下,可以通過以下步驟來監(jiān)聽文檔事件:1.Gettingdocumentobjectfromapplication.usingESRI.ArcGIS.Framework;…IApplicationapp=hookasIApplication;IDocumentappDocument=app.Document;2.DeclareanIDocumentEvents_Eventvariable.usingESRI.ArcGIS.Framework;usingESRI.ArcGIS.ArcMapUI;publicclasshowToClass{privateIDocumentEvents_Eventm_docEvents=null;privatevoidSetUpDocumentEvent(IDocumentmyDocument){m_docEvents=myDocumentasIDocumentEvents_Event;

…}}3.Implementtheeventhandlermethod

voidOnNewDocument(){

……….}4.WiringNewDocumenteventtothehandlingmethod(C#).m_docEvents.NewDocument+=newIDocumentEvents_NewDocumentEventHandler

(OnNewDocument);usingESRI.ArcGIS.Framework;usingESRI.ArcGIS.ArcMapUI;namespaceArcGISProject{

publicclasshowToClass{//Eventmembervariable.privateIDocumentEvents_Eventm_docEvents=null;//Wiring.

privatevoidSetUpDocumentEvent(IDocumentmyDocument){m_docEvents=myDocumentasIDocumentEvents_Event;m_docEvents.NewDocument+=newIDocumentEvents_NewDocumentEventHandler(OnNewDocument);}//Eventhandlermethod.

voidOnNewDocument(){……

}}}

Application、Document實(shí)例CommandInheritingBaseCommand(ZoomToSelectedLayer)DesktopAutomationCSCommandInheritingBaseCommand(ZoomToSelectedLayer)publicoverridevoidOnCreate(objecthook){if(hook==null)return;m_application=hookasIApplication;if(hookisIMxApplication)base.m_enabled=true;elsebase.m_enabled=false;}publicoverridevoidOnClick(){

IMxDocumentmxDocument=GetMxDocument(m_application);ZoomToLayer(mxDocument);}publicIMxDocumentGetMxDocument(IApplicationapplication){IMxDocumentmxDocument=((IMxDocument)(application.Document));returnmxDocument;}publicvoidZoomToLayer(

IMxDocumentmxDocument){

IMapmap=mxDocument.FocusMap;

IActiveViewactiveView=(IActiveView)map;

IContentsViewcontentsView=mxDocument.CurrentContentsView;

ILayerlayer=(ILayer)contentsView.SelectedItem;if(!(layerisILayer)){return;}

activeView.Extent=layer.AreaOfInterest;activeView.Refresh();}DesktopAutomationCSIApplicationm_application;privatevoidbtnStartApp_Click(objectsender,EventArgse){

IDocumentdoc=null;switch(cboApps.SelectedItem.ToString()){case"ArcMap":doc=newMxDocumentClass();break;case"ArcScene":doc=newSxDocumentClass();break;case"ArcGlobe":doc=newGMxDocumentClass();break;}if(doc!=null){

m_application=doc.Parent;m_application.Visible=true;}else{}}2.3CommandsandCommandbars2.3.1命令與命令條概述CommandBars、CommandBar、CommandItem2.3.2

自定義命令和工具2.3.3

自定義工具條和菜單2.3.4Creatingmultiplecommandsortoolsinasingleclass(subtypedcommand)2.3.5動(dòng)態(tài)菜單(MultiItem)2.3.1命令與命令條概述ArcObjects提供了三類命令:單擊命令(簡單命令,Command):僅實(shí)現(xiàn)ICommand接口。用戶單擊事件會(huì)導(dǎo)致對(duì)Icommand.OnClick方法的調(diào)用,并立即執(zhí)行某種動(dòng)作。工具(Tool):實(shí)現(xiàn)了ICommand接口和ITool接口,工具的執(zhí)行需要用戶與地圖顯示進(jìn)行交互。工具控件:實(shí)現(xiàn)了ICommand接口和IToolControl接口,如ArcMap中標(biāo)準(zhǔn)工具條上顯示比例尺的控件,與下拉列表框類似。CommandBars

(ESRI.ArcGIS.Framework)CommandBars是文檔中可用的所有工具條的集合。

ICommandBars接口是CommandBars類的默認(rèn)接口。UseIDocument.CommandBars可獲得對(duì)CommandBars的引用。publicICommandBar

Create(

string

Name,

esriCmdBarType

barType);ArcObjects定義的CommandBar類型有三種:esriCmdBarTypeToolbar(工具條)esdCmdBarTypeMenu(菜單)esriCmdBarTypeShortcutMenu(快捷菜單)publicICommandItem

Find(object

identifier,

bool

noRecurse,

bool

noCreate);CommandBarCommandBar類默認(rèn)實(shí)現(xiàn)ICommandBar接口,它可以添加一個(gè)Command、Menu或者M(jìn)acro到命令條上。程序員可以通過Item屬性得到commandbar中序號(hào)為Index的條目(Item)。使用Dock方法可以顯示或者隱藏CommandBar,并且可以將它放在程序窗體的某個(gè)位置上或者處于浮動(dòng)狀態(tài)。下面的代碼是創(chuàng)建一個(gè)ToolBar:publicoverridevoidOnClick(){IDocumentdoc=m_application.Document;//得到CommandBars集合

ICommandBars

pCmdBars=doc.CommandBars;//產(chǎn)生一個(gè)新的工具欄

ICommandBarpnewBar=pCmdBars.Create("MyToolBar",esriCmdBarType.esriCmdBarTypeToolbar);

//添加兩個(gè)ArcMap已經(jīng)存在的命令到新工具欄上

objectMissing=Type.Missing;

UIDpUid=newUIDClass();pUid.Value="esriArcMapUI.MxAddDataMenu";

pnewBar.Add(pUid,refMissing);pUid=newUIDClass();pUid.Value="esriArcMapUI.FullExtentCommand";pnewBar.Add(pUid,refMissing);////將產(chǎn)生的工具欄停靠在標(biāo)準(zhǔn)工具欄上

pUid=newUIDClass();pUid.Value="esriArcMapUI.StandardToolBar";

ICommandBarpCmdBar=pCmdBars.Find(pUid,false,false)asICommandBar;pnewBar.Dock(esriDockFlags.esriDockBottom,pCmdBar);}ConstantValueDescriptionesriDockHide0Hidesthetoolbar.esriDockShow1Showsthetoolbar.esriDockLeft2Docksthetoolbarontheleftsideoftheapplication.esriDockRight4Docksthetoolbarontherightsideoftheapplication.esriDockTop8Docksthetoolbaronthetopoftheapplication.esriDockBottom16Docksthetoolbaronthebottomoftheapplication.esriDockFloat32Floatsthetoolbar.esriDockToggle64Togglesthetoolbarvisibility.CommandItemCommandItem代表出現(xiàn)在CommandBar上的任何對(duì)象,如一個(gè)Button、Menu和Tool等。ICommandItem接口是其默認(rèn)接口,這個(gè)接口定義的方法可以獲取或者設(shè)置CommandItem的屬性,如設(shè)置標(biāo)題、命令按鈕圖像、提示信息、顯示樣式和進(jìn)行編組等。這個(gè)接口也定義了方法執(zhí)行、刪除、刷新和重置這些CommandItem。使用ICommandBars.Find、ICommandBar.Find或ICommandBar.Item都可以得到某個(gè)特定CommandItem的引用。下面代碼是查找并執(zhí)行一個(gè)命令:publicvoidFindAndExecuteCommand(IApplication

application,stringcmdName){

ICommandBarscommandBars=application.Document.CommandBars;UIDuid=newUIDClass();uid.Value=cmdName;

ICommandItemcommandItem=commandBars.Find(uid,false,false);if(commandItem!=null)commandItem.Execute();}2.3.2自定義命令和工具

自定義命令和工具的實(shí)現(xiàn)方式ExtendingArcGISDesktopwithCustomCommandsorTools自定義命令工具開發(fā)實(shí)例

自定義命令和工具的實(shí)現(xiàn)方式ArcGIS提供了以下四種方式來自定義命令和工具:(1)使用Add-in方式;(2)直接實(shí)現(xiàn)接口;(3)繼承基類;(4)

ArcGIS項(xiàng)模板(推薦使用)。使用Add-in方式從ArcGIS10開始,使用自定義的命令、工具擴(kuò)展ArcGIS桌面應(yīng)用程序,新增了Add-in方式。如果新建Add-in項(xiàng)目,在Add-in項(xiàng)目模板中點(diǎn)選Button和Tool,并設(shè)置相關(guān)屬性,完成該項(xiàng)目模板后在相關(guān)類中添加代碼即可;如果在已有的Add-in項(xiàng)目添加新的命令和工具,則使用Add-incomponent類模板分別添加Button、Tool類到已有的Add-in項(xiàng)目中。直接實(shí)現(xiàn)接口用戶可以通過實(shí)現(xiàn)ICommand接口來創(chuàng)建自定義的命令。由用戶自己定義命令的外觀、狀態(tài)、行為,自己注冊(cè)到COM組件類目里。工具與命令類似,只是要實(shí)現(xiàn)ICommand及ITool兩個(gè)接口,在定義的時(shí)候要考慮鼠標(biāo)事件等。在編程過程中,必須實(shí)現(xiàn)接口的所有成員。ArcGISVS集成框架中的ArcGISClassitemtemplate生成的類就是直接實(shí)現(xiàn)接口所有成員。繼承基類(InheritingArcGISbaseclasses)為了簡化自定義命令和工具等的開發(fā),ESRI提供了幾個(gè)抽象基類,位于ESRI.ArcGIS.ADF.BaseClasses

名稱空間中。BaseCommandBaseToolBaseCommandBarBaseToolbarBaseMenuBaseCustomLayerBaseCustomGlobeLayerBaseDynamicLayerBaseCommandandBaseTool為ICommand和ITool每個(gè)成員提供了缺省的實(shí)現(xiàn)。開發(fā)者不用為每個(gè)成員提供實(shí)現(xiàn)代碼,只需重寫(覆蓋)自定義命令或工具所需要的成員。如ICommand.OnCreate,該成員在初始的類中必須被重寫。ArcGISVS集成框架中的ArcGISBaseCommandandBaseTool

itemtemplates就是通過繼承基類來自定義命令和工具的。BaseCommand和BaseTool有重寫的構(gòu)造函數(shù),使得用戶可以快速地通過構(gòu)造函數(shù)參數(shù)設(shè)置命令和工具的許多屬性,例如Name和Category。重載的BaseCommand構(gòu)造函數(shù)有下面的簽名:publicBaseCommand(

System.Drawing.Bitmapbitmap,

stringcaption,

stringcategory,

inthelpContextId,

stringhelpFile,

stringmessage,

stringname,

stringtoolTip);重載的BaseTool構(gòu)造函數(shù)有下面的簽名:publicBaseTool(

System.Drawing.Bitmapbitmap,

stringcaption,

stringcategory,

System.Windows.Forms.Cursorcursor,

inthelpContextId,

stringhelpFile,

stringmessage,

stringname,

stringtoolTip);當(dāng)編寫一個(gè)新類時(shí),使用這些參數(shù)化的構(gòu)造函數(shù),例如,下面顯示了稱作PanTool的新類繼承了BaseTool類。publicPanTool():base(null,"Pan","MyCustomTools",

System.Windows.Forms.Cursors.Cross,0,"","Pansthemap.","PanTool","Pan") { //

... }作為使用參數(shù)化構(gòu)造函數(shù)的備選方案,可以直接設(shè)置基類的成員?;惐┞镀鋬?nèi)部成員變量給繼承類,每個(gè)屬性一個(gè),這樣可以在繼承類中直接訪問它們。publicPanTool() {base.m_cursor=System.Windows.Forms.Cursors.Cross; base.m_category="MyCustomTools"; base.m_caption="Pan"; base.m_message="Pansthemap."; base.m_name="PanTool"; base.m_toolTip="Pan"; }使用ArcGIS項(xiàng)模板(UsingArcGISitemtemplates)ArcGISVS.NET集成框架提供了多個(gè)項(xiàng)模板,方便ArcGIS開發(fā)人員快速搭建GIS應(yīng)用框架,這種方式是ESRI官方推薦的創(chuàng)建命令、工具等的方式。使用項(xiàng)模板的優(yōu)勢(shì):

(參閱教材P40)

自定義命令工具開發(fā)實(shí)例清除Application的當(dāng)前工具命令在GIS應(yīng)用程序操作過程中,某個(gè)工具一旦使用,如果不使用下一個(gè)工具,它一直處于活動(dòng)狀態(tài),這樣總覺得不是很舒服。這個(gè)實(shí)例的功能就是清除Application上的當(dāng)前活動(dòng)工具。

privateIApplicationm_application;publicClearCurrentToolCmd(){base.m_category="DeveloperSamples";//localizabletextbase.m_caption="ClearCurrentToolCommand";//localizabletextbase.m_message="ClearCurrentToolCommand";//localizabletextbase.m_toolTip="ClearCurrentToolCommand";//localizabletextbase.m_name="ClearCurrentToolCmd";try{stringbitmapResourceName=GetType().Name+".bmp";base.m_bitmap=newBitmap(GetType(),bitmapResourceName);}catch(Exceptionex){MessageBox.Show(""InvalidBitmap");}}publicoverridevoidOnCreate(objecthook){if(hook==null)return;

m_application=hookasIApplication;//DisableifitisnotArcMap

if(hookisIMxApplication)base.m_enabled=true;elsebase.m_enabled=false;}publicoverridevoidOnClick(){

m_application.CurrentTool=null;}ZoomIn3X

CommandprivateIHookHelperm_hookHelper=null;privateIActiveViewm_activeView=null;privateIEnvelopem_avExtent=null;publicZoomIn3X()

{

base.m_category="CustomCommands";base.m_caption="ZoomIn3X";base.m_message="ZoomIn3X";base.m_toolTip="ZoomIn3X";base.m_name="ZoomIn3X";try

{

stringbitmapResourceName=GetType().Name+".bmp";

base.m_bitmap=newBitmap(GetType(),bitmapResourceName);

}catch(Exceptionex)

{

}

}publicoverridevoidOnCreate(objecthook){if(hook==null)return;try

{

m_hookHelper=newHookHelperClass();m_hookHelper.Hook=hook;if(m_hookHelper.ActiveView==null)m_hookHelper=null;

}catch

{m_hookHelper=null;

}if(m_hookHelper==null)base.m_enabled=false;else

{base.m_enabled=true;m_activeView=m_hookHelper.ActiveView;

}

}publicoverridevoidOnClick()

{if(m_activeView==null)

return;m_avExtent=m_activeView.Extent;m_avExtent.Expand(1/3.0,1/3.0,true);//m_avExtent.Expand(3.0,3.0,true);m_activeView.Extent=m_avExtent;m_activeView.Refresh();

}ZoomIn3XToolpublicsealedclassZoomIn3XTool:BaseTool

{privateIHookHelperm_hookHelper=null;privateIActiveViewm_activeView=null;privateIEnvelopem_envelope=null;publicoverridevoidOnCreate(objecthook)

{try

{m_hookHelper=newHookHelperClass();

m_hookHelper.Hook=hook;if(m_hookHelper.ActiveView==null)

{m_hookHelper=null;

}

}catch

{m_hookHelper=null;

}if(m_hookHelper==null)base.m_enabled=false;elsebase.m_enabled=true;

m_activeView=m_hookHelper.ActiveView;}publicoverridevoidOnMouseDown(intButton,intShift,intX,intY)

{IRubberBandpRubberBand=newRubberEnvelopeClass();m_envelope=pRubberBand.TrackNew(m_activeView.ScreenDisplay,null)asIEnvelope;m_envelope.Expand(1/3.0,1/3.0,true);m_activeView.Extent=m_envelope;m_activeView.Refresh();

}2.3.3自定義工具條和菜單命令條(Commandbars)是指像按鈕、工具及子菜單這樣的命令項(xiàng)的容器,包括工具條、菜單和上下文菜單等。

自定義工具條和菜單的實(shí)現(xiàn)方式命令條的創(chuàng)建方式有四種:使用Add-in方式直接實(shí)現(xiàn)接口(IToolbarDef,IMenuDef,IMenuDefandIShortcutMenu)繼承基類(BaseToolbar,BaseMenu)使用ArcGIS項(xiàng)模板(recommended)使用Add-in方式從ArcGIS10開始,使用自定義的工具條、菜單擴(kuò)展ArcGIS桌面應(yīng)用程序,新增了Add-in方式。使用Add-inCommand

Container類模板在已有的Add-in項(xiàng)目中添加新的命令條,并設(shè)置相關(guān)屬性。Add-in項(xiàng)目模板Implementinginterfaces要?jiǎng)?chuàng)建自定義的工具條,需要實(shí)現(xiàn)IToolbarDef接口。在開發(fā)ArcGISEngine應(yīng)用程序中,可以使用IToolbarControl.AddToolbarDef方法將自定義工具條插入到ToolbarControl中。要?jiǎng)?chuàng)建自定義的菜單,需要實(shí)現(xiàn)IMenuDef接口。該接口與IToolbarDef定義相同(其成員都是GetItemInfo、ItemCount、Caption和Name),只不過一個(gè)用于創(chuàng)建菜單,另一個(gè)用于創(chuàng)建工具條。在ArcGIS桌面中,如果要?jiǎng)?chuàng)建上下文菜單(右鍵菜單),需要實(shí)現(xiàn)IMenuDef和IShortcutMenu兩個(gè)接口。IShortcutMenu是一個(gè)指示器接口,僅用于向應(yīng)用程序指明該菜單是右鍵菜單,該接口中并沒有定義任何內(nèi)容。如果要?jiǎng)?chuàng)建根菜單(出現(xiàn)在定制對(duì)話框[Menus]命令類目下的菜單,如圖2-2所示),需要實(shí)現(xiàn)IMenuDef

和IRootLevelMenu兩個(gè)接口。IRootLevelMenu也是一個(gè)指示器接口,僅用于向應(yīng)用程序指明該菜單是根菜單,該接口中并沒有定義任何內(nèi)容。InheritingArcGISbaseclassesBaseToolbar和BaseMenu兩個(gè)基類簡化了自定義工具條和菜單的創(chuàng)建。作為直接實(shí)現(xiàn)IToolbarDef或IMenuDef接口的替代方案,可以繼承這兩個(gè)基類來創(chuàng)建自定義工具條和菜單。基類中重載的AddItem方法比實(shí)現(xiàn)GetItemInfo靈活得多,可以使用命令項(xiàng)的ProgID、UID、CLSID、System.Guid或System.Type將其添加到自定義工具條和菜單上。基類中的BeginGroup方法用于在命令項(xiàng)之間插入分隔符。自定義工具條、菜單的標(biāo)題和名稱可以通過設(shè)置受保護(hù)的成員或重寫只讀屬性來實(shí)現(xiàn)。publicabstractclassBaseToolbar:BaseCommandBar,IToolBarDefpublicabstractclassBaseMenu:BaseCommandBar,IMenuDefBaseCommandBarToolbarpublicsealedclassArcFGISToolbar:BaseToolbar{publicArcFGISToolbar(){AddItem("ArcPXFGIS.ConvertCAD");AddItem("ArcPXFGIS.AddFeatureClass");

BeginGroup();AddItem("esriArcMapUI.ZoomInTool");

BeginGroup();//SeparatorAddItem("{FBF8C3FB-0480-11D2-8D21-080009EE4E51}",1);//undocommandAddItem(newGuid("FBF8C3FB-0480-11D2-8D21-080009EE4E51"),2);//redocommand}……………MenupublicsealedclassArcGISMenu1:BaseMenu{publicArcGISMenu1(){AddItem("esriArcMapUI.ZoomInFixedCommand");

BeginGroup();//SeparatorAddItem("{FBF8C3FB-0480-11D2-8D21-080009EE4E51}",1);//undocommandAddItem(newGuid("FBF8C3FB-0480-11D2-8D21-080009EE4E51"),2);//redocommand}……}ContextMenu

publicsealedclassArcGISContextMenu1:BaseMenu,IShortcutMenu{publicArcGISContextMenu1(){AddItem("esriArcMapUI.ZoomInFixedCommand");

BeginGroup();//SeparatorAddItem("{FBF8C3FB-0480-11D2-8D21-080009EE4E51}",1);//undocommandAddItem(newGuid("FBF8C3FB-0480-11D2-8D21-080009EE4E51"),2);//redocommand}2.3.4創(chuàng)建子命令/子工具一般情況下,一個(gè)類中只有一個(gè)命令或一個(gè)工具,通過實(shí)現(xiàn)ICommandSubtype接口,可以在一個(gè)類中創(chuàng)建多個(gè)命令或工具。ArcMap應(yīng)用程序“File”菜單中的子命令:NameGUID(CLSID/ProgID)SubTypeFile_New{119591DB-0255-11D2-8D20-080009EE4E51}esriArcMapUI.MxFileMenu1File_Open同上2File_Save同上3File_SaveAs同上4File_SaveCopyAs同上12File_PageSetup同上5File_PrintPreview同上6File_Print同上7File_Properties同上8File_Export同上9File_Exit同上10ICommandSubtypeGetCount:這個(gè)CLSID中定義的命令項(xiàng)數(shù);

SetSubType:設(shè)置子命令的屬性,如名稱、標(biāo)題、位圖等??梢酝ㄟ^實(shí)現(xiàn)接口、繼承基類及使用ArcGIS項(xiàng)模板三種方式來創(chuàng)建自定義的子命令、子工具。實(shí)現(xiàn)步驟:創(chuàng)建普通的命令或工具類;publicsealedclassZoomInCommands:BaseCommand實(shí)現(xiàn)ICommandSubType接口;publicsealedclassZoomInCommands:BaseCommand,ICommandSubType在GetCount

方法中返回子命令數(shù)

,如3.實(shí)現(xiàn)SetSubType

方法,設(shè)置子命令或子工具的屬性;實(shí)現(xiàn)命令或工具的其它成員:命令:OnCreate,OnClick工具:OnCreate,鼠標(biāo)事件SubtypeCommandTool實(shí)例(ZoomInCommands.cs、PolyFeedbackTools.cs)publicsealedclassZoomInCommands:BaseCommand,ICommandSubType{privateIApplicationm_application;

privateintm_subtype;privateICommandItemm_xoomCommand;publicZoomInCommands(){//Setupcommonpropertiesbase.m_category=“DeveloperSamples";}publicintGetCount(){return3;}publicvoidSetSubType(intSubType)

{m_subtype=SubType;if(base.Bitmap==0)

{switch(m_subtype){case1:base.m_bitmap=Properties.Resources.ZoomOnce;break;case2:base.m_bitmap=Properties.Resources.ZoomTwice;break;case3:base.m_bitmap=Properties.Resources.ZoomThrice;break;}}

base.m_caption=string.Format("Fixedzoominx{0}(C#)",m_subtype.ToString());base.m_name=string.Format("CSNETSamples_SubTypeCommand{0}",m_subtype);base.m_message=string.Format("Executingfixedzoomin{0}time(s)",m_subtype.ToString());base.m_toolTip=string.Format("FixedZoominx{0}",m_subtype);}

說明:因?yàn)樽用畹腟ubType值是在類的實(shí)例化(調(diào)用構(gòu)造函數(shù))后設(shè)置的,且每個(gè)子命令的屬性也不相同,所以不能在類的構(gòu)造函數(shù)設(shè)置子命令特有的屬性,只能設(shè)置公共屬性。publicoverridevoidOnCreate(objecthook){if(hook==null)return;m_application=hookasIApplication;base.m_enabled=false;if(m_application!=null)

{UIDcmdUID=newUIDClass();

switch(m_application.Name){case"ArcMap":cmdUID.Value="esriArcMapUI.ZoomInFixedCommand";break;case"ArcGlobe":cmdUID.Value="esriArcGlobe.GMxNarrowFOVCommand";break;case"ArcScene":cmdUID.Value="esriArcScene.SxNarrowFOVCommand";break;}

ICommandBarsdocBars=m_application.Document.CommandBars;m_xoomCommand=docBars.Find(cmdUID,false,false);base.m_enabled=m_xoomCommand!=null;

}

}publicoverridevoidOnClick(){for(inti=0;i<m_subtype;i++)m_xoomCommand.Execute();}2.3.5動(dòng)態(tài)菜單(MultiItem)通常情況下,一個(gè)菜單上駐留的命令是固定的。當(dāng)程序運(yùn)行前菜單上的命令不能確定或菜單上的命令需要根據(jù)系統(tǒng)運(yùn)行狀態(tài)進(jìn)行修改時(shí),可以使用動(dòng)態(tài)菜單。如很多應(yīng)用程序File菜單下的最近使用過的文件菜單就是動(dòng)態(tài)菜單。一個(gè)類實(shí)現(xiàn)多個(gè)命令功能。動(dòng)態(tài)菜單實(shí)現(xiàn)IMultiItem接口,其行為就像多個(gè)相鄰的菜單命令。需要?jiǎng)?chuàng)建自定義菜單來駐留MultiItem。MultiItem與子命令或子工具不同,子命令或子工具上的條目數(shù)是固定的,MultiItem是動(dòng)態(tài)的。IMultiItem程序運(yùn)行期間,應(yīng)用程序框架通知?jiǎng)討B(tài)菜單的宿主菜單何時(shí)顯示,以及每一子項(xiàng)如何顯示。OnPopup

方法在其宿主菜單剛出現(xiàn)前被調(diào)用,并提供2個(gè)功能:提供hook參數(shù)返回動(dòng)態(tài)菜單的項(xiàng)數(shù)OnPopup

方法被調(diào)用后,應(yīng)用程序框架為動(dòng)態(tài)菜單的每一子項(xiàng)創(chuàng)建一個(gè)命令項(xiàng),并為每一子項(xiàng)設(shè)置相關(guān)屬性ItemBitmap,ItemCaption,ItemChecked,andItemEnabled

MultiItem顯示后,用戶可以選擇某一項(xiàng),調(diào)用

OnItemClick

方法。

開發(fā)實(shí)例:ZoomToLayerMultiItem

、RecentFilesCommands

ZoomToLayerMultiItem

publicclassZoomToLayerMultiItem:IMultiItem{privateIHookHelperm_hookHelper=null;privateIActiveViewm_activeView=null;privateIMapm_map=null;publicstringCaption

{get{return"ZoomtoLayerMultiItem";}}publicstringName{get{return"ZoomToLayerMultiItem";}}publicintHelpContextID{get{return0;}}publicstringHelpFile{get{return"";}}publicstringMessage{get{return"ZoomtoLayerMultiItem";}}publicintOnPopup(objecthook)

{if(hook==null)return0;m_hookHelper=newHookHelperClass();m_hookHelper.Hook=hook;m_activeView=m_hookHelper.ActiveView;m_map=m_hookHelper.FocusMap;returnm_map.LayerCount;}publicvoidOnItemClick(intindex){ILayerm_currentLayer=m_map.get_Layer(index);

m_activeView.Extent=m_currentLayer.AreaOfInterest;m_activeView.Refresh();}publicstringget_ItemCaption(intindex){ILayerm_currentLayer=m_map.get_Layer(index);return"ZoomTo"+m_currentLayer.Name;}publicboolget_ItemEnabled(intindex){ILayerm_currentLayer=m_map.get_Layer(index);returnm_currentLayer.Visible;}publicintget_ItemBitmap(intindex){return0;//Notimplemented.}publicboolget_ItemChecked(intindex){returnfalse;}RootMenuZoomToLayerMultiItempublicsealedclassRootMenuZoomToLayerMultiItem:BaseMenu,IRootLevelMenu{publicRootMenuZoomToLayerMultiItem(){AddItem("{bb0a9be6-0319-487a-a8c5-716378090388}");//ZoomToLayerMultiItemBeginGroup();//SeparatorAddItem("esriArcMapUI.ZoomInFixedCommand");}publicoverridestringCaption{get{return"ZoomtoLayerMultiItem";}}publicoverridestringName{get{return"RootMenuZoomToLayerMultiItem";}}2.4應(yīng)用程序擴(kuò)展(Extension)2.4.1應(yīng)用程序擴(kuò)展概述應(yīng)用程序擴(kuò)展(Extension)提供給開發(fā)者一個(gè)擴(kuò)展ArcGIS核心功能的強(qiáng)大機(jī)制。一個(gè)Extension(擴(kuò)展對(duì)象)可以給ArcGIS新建一個(gè)工具欄,也可以對(duì)應(yīng)用程序發(fā)生的某些事件進(jìn)行監(jiān)聽并做出響應(yīng),進(jìn)行一些初始化工作。Extension是由Application對(duì)象直接管理的。應(yīng)用程序擴(kuò)展有兩種類型:標(biāo)準(zhǔn)擴(kuò)展(Standardextension)和即時(shí)擴(kuò)展(Just-in-timeextension)。兩種擴(kuò)展實(shí)現(xiàn)的接口都是IExtension和IExtensionConfig(可選),任何實(shí)現(xiàn)了IExtensionConfig的擴(kuò)展都將顯示在擴(kuò)展對(duì)話框中。它們的區(qū)別是啟動(dòng)的時(shí)機(jī)和注冊(cè)的地方不同。標(biāo)準(zhǔn)擴(kuò)展任何被注冊(cè)到應(yīng)用程序的標(biāo)準(zhǔn)擴(kuò)展,會(huì)自動(dòng)被應(yīng)用程序載入或者卸載。例如一個(gè)被添加到ESRIMxExtensions類目中的擴(kuò)展對(duì)象會(huì)在ArcMap啟動(dòng)的時(shí)候自動(dòng)啟動(dòng),在ArcMap關(guān)閉的時(shí)候自動(dòng)關(guān)閉,用戶對(duì)此不需要進(jìn)行任何的干預(yù)操作。標(biāo)準(zhǔn)擴(kuò)展基本的啟動(dòng)順序:用戶啟動(dòng)應(yīng)用程序;Application自動(dòng)產(chǎn)生;文檔對(duì)象創(chuàng)建;擴(kuò)展對(duì)象被載入;打開、載入一個(gè)文檔文件;程序啟動(dòng)完畢。標(biāo)準(zhǔn)擴(kuò)展注冊(cè)的組件類目:ESRIGxextensions(ArcCatalog)ESRIMxextensions(ArcMap)ESRISxextensions(ArcScene)ESRIGMxextensions(ArcGlobe)即時(shí)擴(kuò)展為了提高應(yīng)用程序在啟動(dòng)時(shí)候的性能,just-in-time(JIT)extension被設(shè)計(jì)為僅當(dāng)有請(qǐng)求時(shí)才被載入應(yīng)用程序,而不是在應(yīng)用程序啟動(dòng)的時(shí)候載入,即當(dāng)應(yīng)用程序框架調(diào)用某個(gè)IExtension.Startup方法時(shí),這個(gè)extension被載入。當(dāng)應(yīng)用程序第一次調(diào)用IApplication.FindExtensionByCLSID()方法查找某個(gè)及時(shí)擴(kuò)展時(shí),這個(gè)即時(shí)擴(kuò)展被創(chuàng)建,IExtension.Startup()方法被調(diào)用。

IApplication.FindExtensionByName()方法,對(duì)及時(shí)擴(kuò)展不是總有效。即時(shí)擴(kuò)展注冊(cè)的組件類目:ESRIGxJITextensions(ArcCatalog)ESRIMxJITextensions(ArcMap)ESRISxJITextensions(ArcScene)ESRIGMxJITextensions(ArcGlobe)2.4.2創(chuàng)建應(yīng)用程序擴(kuò)展標(biāo)準(zhǔn)應(yīng)用程序擴(kuò)展和即時(shí)應(yīng)用程序擴(kuò)展都實(shí)現(xiàn)了IExtension和IExtensionConfig(可選)接口,它們的區(qū)別是啟動(dòng)的時(shí)機(jī)和注冊(cè)的地方不同。ArcGISVisualStudio集成框架為應(yīng)用程序擴(kuò)展的開發(fā)提供了兩個(gè)項(xiàng)模板(ItemTemplate):ApplicationExtension模板和JustInTimeExtension模板,兩個(gè)模板的實(shí)現(xiàn)都一樣,只是注冊(cè)方法的內(nèi)容不一樣,即注冊(cè)的組件類目不同。SamplesDesktopExtensionsOpenSaveLogExtensionCustomizingAtStartupSelectionCOMSample數(shù)據(jù)視圖(DataView)中的ContextMenu功能:在數(shù)據(jù)視圖的右鍵菜單中實(shí)現(xiàn)ZoomToLayer的MultiItem功能。關(guān)鍵技術(shù):使用Extension,擴(kuò)展應(yīng)用程序功能;使用IDocumentEve

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論