如果你新建一個AxMapControl類的對象再新建一個MapControlClass對象你會發現他們擁有的方法和屬性事件等基本上差不多,但是后者還是要多幾個。
其實就是COM和托管的區別啦。大家都知道.NET是托管環境的,而ArcGIS是基於COM技術實現的,也就是說他和托管的代碼不能直接訪問,必須經過轉換,或叫做包裝。MapControlClass在COM組件庫中就是MapControl,在.NET中給所有的類加上了CLass的后最而已,AxMapControl就是MapControl經過包裝后的ActiveX控件了,由於所有的在Windows Form環境下顯示的控件都繼承AxHost類,故平常我們在工具條上拖過來的就是.NET包裝的MapControl了,他可以在Winform編程中可視化顯示,如果你想通過AxMapControl包裝類的COM類的話有兩個方法:一個就是通過Object屬性,另外就是GetOcx方法了。
在9.0以前的AE開發中,.Net還沒有出現,是只存在Com控件的,在9x以后的產品中,ESRI建立了基於.net的開發包,所以ESRI MapControl是基於Com的接口,AxMapcontrol是.net中我們所使用的開發activeX控件,這個控件也是繼承於ESRI Mapcontrol接口而實現的。
AxMapControl和vs2005中自帶的MapControl功能類似,不用加載,打開vs2005自己就有。如果不小心刪除,可以重置工具箱。
因為MapControl是一個自動化控件,當它被放到一個容器,如窗體上后,它會自動產生一個被稱為axMapControl1的對象。IMapControl2,IMapControl3,IMapControl4是接口;
AxMapControl是控件,並實現了以上接口;
axMapControl1是AxMapControl實例化的對象。
三者關系如下所示:
this.axMapControl1 = new ESRI.ArcGIS.Controls.AxMapControl();
IMapControl2 pMapControl2=axMapControl1.Object;
之所以會出現2,3之類的后綴,是因為隨着每次AE的更新升級,會增加一些新的功能,數字越靠后說說明這個接口越新。ESRI是建議使用新接口的。但原來的2或3還不能去掉,因為他要考慮到和以前老版本寫代碼的兼容性。
接口定義好后是不可以改動的 所以多了2 3 4.。。。
