制圖控件,
如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所示。
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcuMTY5ImY4MWZhZDM4UjZ5UjY1IjNzkTOjFzM1IjZjBjMfdWbp9CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.png)
1.1 IMapControlDefault接口
IMapControlDefault接口是地圖控件預設接口。當将MapControl控件拖放到容器上時,會自動建立一個axMapControl1的對象,該對象全部繼承父類接口的屬性和方法。下面的代碼示範了如何使用這個接口。
IMapControlDefault mapControlDefault;
MapControl mapControl;
mapControl = axMapControl1.object as IMapControlDefault;
1.2 IMapControl2接口
IMapControl2接口提供了一系列的屬性和方法,如設定控件外觀,設定Map對象或控件的顯示屬性,添加和管理資料圖層、地圖文檔,在控件上繪制圖形和傳回幾何對象等,如圖2-2所示。
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是視訊重新整理觸發事件。
2、頁面布局控件
PageLayoutControl控件主要用于頁面布局與制圖。該控件封裝了PageLayout類,提供了布局視圖中控制元素的屬性和方法,以及其他的事件、屬性和方法。
Printer屬性提供了處理地圖列印的設定。
Page屬性提供了處理控件的頁面效果。
Element屬性則用于管理控件中的地圖元素。
PageLayoutControl控件不能添加地圖圖層或地理資料,必須通過使用MXD檔案來加載需要處理的資料。PageLayoutControl控件主要實作IPageLayoutControlDefault、IPageLayoutControl、IPageLayoutControl2、IPageLayoutControlevents等接口,
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方法。