天天看點

ArcGIS Engine開發之旅03--ArcGIS Engine中的控件

制圖控件,

如MapControl、PageLayoutControl,其中MapControl控件主要用于地理資料的顯示和分析,PageLayoutControl用于生成一幅成品地圖。MapControl封裝了Map對象,而PageLayoutControl則封裝了PageLayout對象。這兩個控件都實作了IMxContents接口,是以不僅可以讀取ArcMap建立的地圖文檔,而且可以将自身的地圖内容寫到一個新的地圖文檔中。

三維控件,

如GlobeControl、SceneControl都具有導航功能,允許終端使用者操作三維視圖,而不必使用控件指令或自定義指令。通過設定Navigate屬性,使用者就可以操作三維視圖,如前後左右移動、放大縮小等。

架構控件,

如TOCControl、ToolbarControl,需要與其他的控件協作使用。例如在TOCControl控件屬性頁中設定與MapControl關聯,單在MapControl中删除一個圖層時,該圖層也從TOCControl中删除。

1、制圖控件介紹 

MapControl控件封裝了Map對象,并提供了其他的屬性、方法和事件,用于管理控件的外觀、顯示屬性和地圖屬性,管理、添加資料圖層,裝載地圖文檔,顯示、繪制跟蹤圖層。MapControl上存在着諸如TrackRectangle、TrackPolygon、TrackLine和TrackCircle等幫助方法,用于追蹤或“橡皮圈住(rubber banding)”顯示上的幾何圖形(Shape)。VisibleRegion屬性可用于更改MapControl顯示區内的幾何圖形。MapControl控件實作的主要接口有IMapControlDefault、IMapControl2、IMapControl3、IMapControlEvents2等,如圖2-1所示。

ArcGIS Engine開發之旅03--ArcGIS Engine中的控件

1.1 IMapControlDefault接口

IMapControlDefault接口是地圖控件預設接口。當将MapControl控件拖放到容器上時,會自動建立一個axMapControl1的對象,該對象全部繼承父類接口的屬性和方法。下面的代碼示範了如何使用這個接口。

IMapControlDefault mapControlDefault;

MapControl mapControl;

mapControl = axMapControl1.object as IMapControlDefault;

1.2 IMapControl2接口

IMapControl2接口提供了一系列的屬性和方法,如設定控件外觀,設定Map對象或控件的顯示屬性,添加和管理資料圖層、地圖文檔,在控件上繪制圖形和傳回幾何對象等,如圖2-2所示。

ArcGIS Engine開發之旅03--ArcGIS Engine中的控件

1.3 IMapControl3接口

該接口繼承自IMapControl2,并增加了8個屬性和一個方法。

CustomProperty:設定自定義控件屬性。

DocumentFilename:傳回MapControl裝入的地圖文檔的檔案名。

DocumentMap:傳回MapControl最後裝入的地圖名稱。

KyeIntercept:傳回或設定MapControl截取鍵盤按鍵資訊。

Object:傳回MapControl控件。

IMapControl2 mapControl2;

mapControl2 = axMapControl1.Object as IMapControl2;

mapControl2 = axMapControl1.GetOcx() as IMapControl2;

IMapControl3 mapControl3;

mapControl3 = axMapControl1.Object as IMapControl3;

mapControl3 = axMapControl1.GetOcx() as IMapControl3;

ShowMapTips:确定是否顯示地圖的Map Tips。

TipDelay:設定Map Tips的延遲時間。

TipStyle:設定Map Tips的顯示樣式。

SuppressResizeDrawing():當控件尺寸發生變化時阻止資料實時重繪。

1.4 IMapControlEvents2接口

IMapControlEvents2定義了MapControl能夠處理的全部事件,如圖2-3所示。其中,OnBeforeScreenDraw事件是螢幕繪制前觸發的事件,OnViewRefreshed是視訊重新整理觸發事件。

ArcGIS Engine開發之旅03--ArcGIS Engine中的控件

 2、頁面布局控件

PageLayoutControl控件主要用于頁面布局與制圖。該控件封裝了PageLayout類,提供了布局視圖中控制元素的屬性和方法,以及其他的事件、屬性和方法。

Printer屬性提供了處理地圖列印的設定。

Page屬性提供了處理控件的頁面效果。

Element屬性則用于管理控件中的地圖元素。

PageLayoutControl控件不能添加地圖圖層或地理資料,必須通過使用MXD檔案來加載需要處理的資料。PageLayoutControl控件主要實作IPageLayoutControlDefault、IPageLayoutControl、IPageLayoutControl2、IPageLayoutControlevents等接口,

ArcGIS Engine開發之旅03--ArcGIS Engine中的控件

2.1 IPageLayoutControlDefault接口

IPageLayoutControlDefault是界面調用的預設接口。該接口是純接口,是以可以在新版本中使用。接口的方法和屬性都是相同的最高版本的主界面上的PageLayoutControl,例如IPageLayoutControlDefault相當于IPageLayoutControl2,但在以後的新版本中可能成為IPageLayoutControl3。通過使用IPageLayoutControlDefault接口,可以保證使用的PageLayoutControl是最新版本。

2.2 IPageLayoutControlevents接口

3、架構控件介紹

3.1 圖層樹控件——TOCControl

     TOCControl是用來管理圖層的可見性和标簽的編輯。TOCControl需要一個“夥伴控件”(buddyControl),或實作了IActiveView接口的對象協同工作。“夥伴控件”可以是MapControl、PageLayoutControl、ReaderControl、SceneControl或GlobeControl。“夥伴控件”可以通過TOCControl屬性頁設定,或者在駐留TOCControl的容器被顯示時用SetBuddyControl方法通過程式設計設定。TOCControl的每個“夥伴控件”都實作了ITOCBuddy接口。TOCControl用“夥伴控件”來顯示其地圖、圖層和符号體系内容的一個互動樹視圖,并保持其内容與“夥伴控件”同步。TOCControl通過ITOCBuddy接口來通路其“夥伴控件”。

    TOCControl的主要接口有兩個,一個是ITOCControl,一個是ITOCControlEvents。ITOCControl接口是任何與TOCControl有關的任務的出發點,如設定控件的外觀、設定“夥伴控件”、管理圖層的可見性和标簽的編輯等。ITOCControlEvents是一個事件接口,它定義了TOCControl能夠處理的全部事件,如OnMouseDown、OnMouseMove、OnMouseUp等,這些事件在建構獨立應用程式中經常使用,如OnBeginLabelEdit、OnEndLabelEdit分别是TOCControl中的标簽開始編輯、結束編輯時觸發。

3.2 工具欄控件——ToolbarControl

ToolbarControl包括6個對象及相關接口:ToolbarControl、ToolbarItem、ToolbarMenu、CustomizeDialog、MissingCommand。ToolbarControl要與一個“夥伴控件”協同工作,通過ToolbarControl屬性頁設定,或者在駐留ToolbarControl的容器被顯示時用SetBuddyControl方法通過程式設計設定。

ToolbarControl的每個“夥伴控件”都實作了IToolbarBuddy接口,這個接口用于設定“夥伴控件”的CurrentTool屬性。如通過設定MapControl作為其“夥伴控件”,當使用者單擊該ToolbarControl上的“拉框放大”工具時,該放大工具就會成為MapControl的

CurrentTool。放大工具的實作過程是:通過ToolbarControl擷取其“夥伴控件”,然後在MapControl上提供顯示終端使用者拉動滑鼠所畫的框,并改變MapControl的顯示範圍。

ToolbarControl一般要與一個“夥伴控件”協同工作,并有一個控件指令選擇集,以便快速提供功能強大的GIS應用程式。ToolbarControl不僅提供了部分使用者界面,而且還提供了部分應用程式架構。ArcGIS Desktop應用程式,如ArcMap、ArcGlobe和ArcScene等具有強大而靈活的架構,包括諸如工具條、指令、菜單、泊靠視窗和狀态條等使用者界面元件,這些架構使終端使用者可以通過改變位置、添加和删除這些使用者界面元件來定制應用程式。

ArcGIS Engine提供了幾套使用ArcGIS控件的指令,以便執

行某種特定動作,開發人員可通過建立執行特定任務的定制指令來擴充這套控件指令。所有的指令對象都實作了ICommand接口,ToolbarControl在适當的時候要使用該接口來調用方法和通路屬性。在指令對象被駐留到ToolbarControl後,就會立即調用ICommand::OnCreate方法,這個方法将一個句柄(Handle)或鈎子(hook)傳遞給該指令操作的應用程式。指令的實作一般都要經過測試,以檢視該鈎子(hook)對象是否被支援,如果不支援則該鈎子自動失效,如果支援,指令則存儲該鈎子以便以後使用。ToolbarControl使用鈎子(hook)來聯系指令對象和“夥伴控件”,并提供了屬性、方法和事件用于管理控件的外觀,設定夥伴控件,添加、删除指令項,設定目前工具等。ToolbarControl的主要接口有:IToolbarControl、IToolbarControlDefault、IToolbarControlEvents。

(1)IToolbarControl:該接口是任何與ToolbarControl有關的任務的出發點,如設定“夥伴控件”的外觀,添加或去除指令、工具、菜單等。

(2)IToolbarControlDefault:該接口是自動暴露的預設的dispatch接口,該接口的屬性和方法與ToolbarControl的最高版本主接口的屬性、方法相同。例如目前版本中的IToolbarControlDefault等同于IToolbarControl,但在今後的新版本中,可能會變為IToolbarControl2。在開發中使用IToolbarControlDefault接口,能夠保證總是通路到最新版本的ToolbarControl。

(3)IToolbarControlEvents:該接口是一個事件接口,定義了ToolbarControl能夠處理的全部事件,如OnDoubleClick、OnItemClick、OnKeyDown等。

在ToolbarControl上可以駐留以下3類指令。

(1)實作了響應單擊事件的ICommand接口的單擊指令。使用者單擊事件,會導緻ICommand::OnClick方法的調用,并執行某種動作。通過改變ICommand::Checked屬性的值,簡單指令項的行為就像開關那樣。單擊指令可以駐留在菜單中的唯一指令類型。

(2)實作了ICommand接口和ITool接口、需要終端使用者與“夥伴控件”的顯示進行互動的工具。ToolbarControl維護CurrentTool屬性。當終端使用者單擊ToolbarControl上的工具時,該工具就成為CurrentTool。ToolbarControl會設定“夥伴控件”的CurrentTool屬性。當某個工具為CurrentTool時,該工具會從“夥伴控件”收到滑鼠和鍵盤事件。

(3)實作ICommand接口和IToolControl接口的工具控件。

這通常是使用者界面元件。ToolbarControl駐留了來自IToolControl:hWnd屬性視窗句柄提供的一個小視窗,隻能向ToolbarControl添加特定工具控件的一個例程。

可以使用3種方法向ToolbarControl添加指令,第1種是指定唯一識别指令的一個UID,第2種是指定一個progID,第3種是給AddToolbarDef方法提供某個現有指令對象的一個例程。下面給出樣例代碼:

//Add a toolbardef by passing a UID

UID uID = new UIDsClass();

uID.Value = “esriControls.ControlsMapNavigationToolbar”;

axToolbarControl1.AddToolbarDef(uID, -1, false, 0, esriCommandStyles.esriCommandStyleIconOnly);

//Add a toolbar def by passing a ProgID

string progID = “esriControls.ControlsMapNavigationToolbar”;

等屬性同步。改變UpdateInterval屬性可以更改更axToolbarControl1.AddToolbarDef(progID, -1, false, 0, esriCommandStyles.esriCommandStyleIconOnly);

//Add a toolbardef by passing an IToolbarDef

IToolBarDef toolBarDef = new ControlsMapNavigationToolbarClass();

axToolbarControl1.AddToolbarDef(toolBarDef, -1, false, 0, esriCommandStyles.esriCommandStyleIconOnly);

ToolbarControl更新指令的使用。預設情況下,ToolbarControl每半秒鐘自動更新一次,以確定駐留在ToolbarControl上的每個工具條指令項的外觀與底層指令的Enabled、Bitmap、Caption新頻率。UpdateInterval為0會停止任何自動發生的更新,可以通過程式設計調用Update方法以重新整理每個工具條指令項的狀态。

在應用程式中首次調用Update方法時,ToolbarControl會檢查每個工具條指令項的底層指令的ICommand::OnCreate方法是否已經被調用過,如果還沒有調用過該方法,該ToolbarCommand将作為鈎子被自動傳遞給ICommand::OnCreate方法。

繼續閱讀