ArcEngine開發之Command控制項使用篇在ArcEngine類庫中有大量的Command控制項用來與地圖控制項進行操作和互動。比如有一系列的地圖瀏覽控制項、地圖查詢控制項、圖斑選取控制項、編輯控制項來與MapControl和PageLayoutControl進行互動。這些控制項被包含在ESRI.ArcGIS.Controls.dll類庫中,位於ESRI.ArcGIS.Controls命名空間下。
這些內建的Command控制項可以單獨執行個體化來使用,也可以被安置在一個AxToolbarControl工具列控制項中,繼而被存放在一個CommandPool池中以備調用。下面對這兩種方式分別加以說明:
第一種使用方式是執行個體化一個Command對象並顯式地運行它:
ICommand command = new ControlsOpenDocCommandClass();
command.OnCreate(m_mapControl.Object);
command.OnClick();
其中ControlsOpenDocCommandClass就是一個Command控制項,通過調用它的OnCreate方法傳遞給它需要互動的MapControl,然後調用它的OnClick方法就可以運行。上面的例子會啟用一個開啟地圖文檔的對話方塊。
另一種方法是更加常用的方法。
由於每個Command對象都是一個COM組件,所以ESRI.ArcGIS.Controls下的各個類只是對底層的COM對象的一種封裝。由於是COM對象,所以每一個Command對象都有自己的CLSID和ProgID,並在安裝Engine Runtime的時候被註冊了,你可以在註冊表的HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\找到這些Command的註冊資訊,如果要尋找所有Command的資訊,請訪問Built-in commands。由於是COM組件,在執行個體化它的過程中,.net需要執行個體化一個Runtime Callable Wrapper(RCW)對象,來代理對COM組件的調用。
由於大部分對地圖控制項的操作都直接或間接的來自於工具列,比如點擊工具列上面的放大、縮小、全圖按鈕。那麼實際上我們的絕大部分Command對象都可以被寄放到這個工具列之中。方法非常簡單:
axToolbarControl1.AddItem("esriControls.ControlsMapZoomInTool");
此處使用的esriControls.ControlsMapZoomInTool就是ControlsMapZoomInToolClass類所指向的COM組件的ProgID,需要所有這些Command的資訊時,你應該到Built-in commands這個頁面下尋找,或在你的Engine協助文檔中ms-help://ESRI.EDNv9.2/NET_Engine/b9a335a2-f653-44a1-8961-89051f2e958f.htm的位置。
通過AddItem添加到工具列中的Command控制項使用非常方便,添加了它以後你就再不用操心進一步的處理它與地圖控制項的互動了。Engine內部是怎麼做到這一點的呢,記得我們在第一種方法中執行個體化一個Command控制項時調用的OnCreate方法嗎,當時我們傳遞給它一個MapControl來告訴它需要控制哪一個地圖控制項。而通過axToolbarControl1.AddItem添加的控制項,由於ToolbarControl將這個控制項放到自己的控制項池時,就已經調用了它的OnCreate方法,並傳遞給了它自己的BuddyControl作為控制對象,於是,一切都變得簡單了。
在實際開發項目中,我們往往不想暴露出ArcEngine內建的ToolBar控制項,而是給使用者展示我們自己開發的工具列控制項。另一方面,我們也想使用這種簡單的添加控制項機制。如果做到呢,方法就是在設計階段,仍然拖放一個ToolbarControl到表單上,但是在屬性中將它的Visible設定為false,這樣就不會顯示出來了,而我們可以往這個工具列中添加大量的Command控制項。
這個隱藏的工具列如何使用呢,請看下面這個函數:
public void SetCurrentMapTool(string commandName)
{
//先重設地圖當前工具
m_Map.CurrentTool = null;
for (int i = 0; i < m_toolbarControl.CommandPool.Count; i++)
{
_command = m_toolbarControl.CommandPool.get_Command(i);
if (_command.Name == commandName)
{
m_Map.CurrentTool = _command as ITool;
_command.OnClick();
break;
}
}
}
前面提到ToolbarControl內部維護一個Command池,在這個池中存放了所有已添加的Command對象,擷取其中的Command可以通過CommandPool的get_Command方法,通過比較Command的名稱,可以得到想要的Command對象。這個名稱可不同於ProgID,它是另一個用來標識Command控制項的字串,具體的請在Built-in commands上尋找(第一列),比如我們之前添加的ZoomInTool控制項,它的ProgID是esriControls.ControlsMapZoomInTool,它的Name是ControlToolsMapNavigation_ZoomIn。
請注意這一行:
m_Map.CurrentTool = _command as ITool;
當Command對象處理的不只是開啟地圖,顯示全圖這類沒有與地圖互動的功能時,簡單的使用OnClick即可,但是當需要的是拖動滑鼠控制縮放,空間查詢這類必須與地圖進行互動的動作時,就必須設定MapControl的CurrentTool屬性。
通過上面介紹的方法,就可以不僅利用Toolbar控制項管理Command功能,又可以提供豐富的UI,保證表現層的靈活性。
內建的一系列Command控制項可以滿足我們很多的功能需求,但是仍有稍顯不足的時候,比如Identify控制項的全英文介面,會使有些使用者抓狂。這時,我們可以通過自己開發Command控制項來擴充出我們需要的功能,並可以像內建Command一樣的使用。以後的文章會給大家來介紹。
來自:http://www.cnblogs.com/renji/archive/2008/01/18/arcengine_command1.html在ArcEngine類庫中有大量的Command控制項用來與地圖控制項進行操作和互動。比如有一系列的地圖瀏覽控制項、地圖查詢控制項、圖斑選取控制項、編輯控制項來與MapControl和PageLayoutControl進行互動。這些控制項被包含在ESRI.ArcGIS.Controls.dll類庫中,位於ESRI.ArcGIS.Controls命名空間下。
這些內建的Command控制項可以單獨執行個體化來使用,也可以被安置在一個AxToolbarControl工具列控制項中,繼而被存放在一個CommandPool池中以備調用。下面對這兩種方式分別加以說明:
第一種使用方式是執行個體化一個Command對象並顯式地運行它:
ICommand command = new ControlsOpenDocCommandClass();
command.OnCreate(m_mapControl.Object);
command.OnClick();
其中ControlsOpenDocCommandClass就是一個Command控制項,通過調用它的OnCreate方法傳遞給它需要互動的MapControl,然後調用它的OnClick方法就可以運行。上面的例子會啟用一個開啟地圖文檔的對話方塊。
另一種方法是更加常用的方法。
由於每個Command對象都是一個COM組件,所以ESRI.ArcGIS.Controls下的各個類只是對底層的COM對象的一種封裝。由於是COM對象,所以每一個Command對象都有自己的CLSID和ProgID,並在安裝Engine Runtime的時候被註冊了,你可以在註冊表的HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\找到這些Command的註冊資訊,如果要尋找所有Command的資訊,請訪問Built-in commands。由於是COM組件,在執行個體化它的過程中,.net需要執行個體化一個Runtime Callable Wrapper(RCW)對象,來代理對COM組件的調用。
由於大部分對地圖控制項的操作都直接或間接的來自於工具列,比如點擊工具列上面的放大、縮小、全圖按鈕。那麼實際上我們的絕大部分Command對象都可以被寄放到這個工具列之中。方法非常簡單:
axToolbarControl1.AddItem("esriControls.ControlsMapZoomInTool");
此處使用的esriControls.ControlsMapZoomInTool就是ControlsMapZoomInToolClass類所指向的COM組件的ProgID,需要所有這些Command的資訊時,你應該到Built-in commands這個頁面下尋找,或在你的Engine協助文檔中ms-help://ESRI.EDNv9.2/NET_Engine/b9a335a2-f653-44a1-8961-89051f2e958f.htm的位置。
通過AddItem添加到工具列中的Command控制項使用非常方便,添加了它以後你就再不用操心進一步的處理它與地圖控制項的互動了。Engine內部是怎麼做到這一點的呢,記得我們在第一種方法中執行個體化一個Command控制項時調用的OnCreate方法嗎,當時我們傳遞給它一個MapControl來告訴它需要控制哪一個地圖控制項。而通過axToolbarControl1.AddItem添加的控制項,由於ToolbarControl將這個控制項放到自己的控制項池時,就已經調用了它的OnCreate方法,並傳遞給了它自己的BuddyControl作為控制對象,於是,一切都變得簡單了。
在實際開發項目中,我們往往不想暴露出ArcEngine內建的ToolBar控制項,而是給使用者展示我們自己開發的工具列控制項。另一方面,我們也想使用這種簡單的添加控制項機制。如果做到呢,方法就是在設計階段,仍然拖放一個ToolbarControl到表單上,但是在屬性中將它的Visible設定為false,這樣就不會顯示出來了,而我們可以往這個工具列中添加大量的Command控制項。
這個隱藏的工具列如何使用呢,請看下面這個函數:
public void SetCurrentMapTool(string commandName)
{
//先重設地圖當前工具
m_Map.CurrentTool = null;
for (int i = 0; i < m_toolbarControl.CommandPool.Count; i++)
{
_command = m_toolbarControl.CommandPool.get_Command(i);
if (_command.Name == commandName)
{
m_Map.CurrentTool = _command as ITool;
_command.OnClick();
break;
}
}
}
前面提到ToolbarControl內部維護一個Command池,在這個池中存放了所有已添加的Command對象,擷取其中的Command可以通過CommandPool的get_Command方法,通過比較Command的名稱,可以得到想要的Command對象。這個名稱可不同於ProgID,它是另一個用來標識Command控制項的字串,具體的請在Built-in commands上尋找(第一列),比如我們之前添加的ZoomInTool控制項,它的ProgID是esriControls.ControlsMapZoomInTool,它的Name是ControlToolsMapNavigation_ZoomIn。
請注意這一行:
m_Map.CurrentTool = _command as ITool;
當Command對象處理的不只是開啟地圖,顯示全圖這類沒有與地圖互動的功能時,簡單的使用OnClick即可,但是當需要的是拖動滑鼠控制縮放,空間查詢這類必須與地圖進行互動的動作時,就必須設定MapControl的CurrentTool屬性。
通過上面介紹的方法,就可以不僅利用Toolbar控制項管理Command功能,又可以提供豐富的UI,保證表現層的靈活性。
內建的一系列Command控制項可以滿足我們很多的功能需求,但是仍有稍顯不足的時候,比如Identify控制項的全英文介面,會使有些使用者抓狂。這時,我們可以通過自己開發Command控制項來擴充出我們需要的功能,並可以像內建Command一樣的使用。以後的文章會給大家來介紹。