版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五版電力工程項(xiàng)目居間代理傭金服務(wù)合同2篇
- 二零二五版電子商業(yè)買賣合同模板3篇
- 二零二五年度工地鋼管外架施工環(huán)保設(shè)施設(shè)計(jì)與安裝承包合同3篇
- 白葉2025版離婚協(xié)議中共同財(cái)產(chǎn)分割及子女撫養(yǎng)費(fèi)用支付合同二零二五年度3篇
- 二零二五版30天退換租免傭租賃服務(wù)合同2篇
- 二零二五年生活垃圾收運(yùn)一體化服務(wù)合同2篇
- 二零二五年度神東派遣工權(quán)益同工同酬合同3篇
- 2025年度彩鋼圍擋施工及租賃一體化合同3篇
- 二零二五年度食品安全風(fēng)險(xiǎn)評(píng)估模型構(gòu)建合同3篇
- 二零二五年度鋼筋產(chǎn)品研發(fā)與技術(shù)轉(zhuǎn)移合同3篇
- 2025年河南鶴壁市政務(wù)服務(wù)和大數(shù)據(jù)管理局招聘12345市長熱線人員10人高頻重點(diǎn)提升(共500題)附帶答案詳解
- 建設(shè)項(xiàng)目安全設(shè)施施工監(jiān)理情況報(bào)告
- 春節(jié)期間安全施工措施
- 2025年大唐集團(tuán)招聘筆試參考題庫含答案解析
- 建筑工地春節(jié)期間安全保障措施
- 2025山東水發(fā)集團(tuán)限公司招聘管理單位筆試遴選500模擬題附帶答案詳解
- 2024-2030年中國建筑玻璃行業(yè)市場(chǎng)深度調(diào)研及競(jìng)爭格局與投資價(jià)值預(yù)測(cè)研究報(bào)告
- 泌尿:膀胱腫瘤病人的護(hù)理查房王雪-課件
- 企業(yè)短期中期長期規(guī)劃
- 路面彎沉溫度修正系數(shù)
- 藥店員工教育培訓(xùn)資料
評(píng)論
0/150
提交評(píng)論