原文 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所示。
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方法。