1. 程式人生 > >MFC中ActiveX控制元件的使用

MFC中ActiveX控制元件的使用

    Windows系的開發做的很少,也暈乎暈乎的。

    最近學習了下Arcgis的開發,話說C++開發相關的資料還真少。好不容易從網上找了篇資料,算是入了門(或者還在門外頭,但是找到門了)。感謝這位同仁:

    http://blog.csdn.net/yiersl/article/details/16856479

    在MFC中新增上MapControl的控制元件之後。手動新增一個IMapControl2Ptr型別的變數,然後用手動新增的變數再去手動的與控制元件關聯,才能進一步呼叫或者設定控制元件的方法和屬性。我上一次使用MFC是什麼時候來著?貌似很久遠了。不過我依稀記得,為控制元件新增變數這種事情在MFC當中點點滑鼠就能完成了啊,於是我就試了一下。過程雖然很艱辛,但最後終究是實現了。在這個過程中,發現了幾個不理解認為很奇怪的地方:

    ① 通過類嚮導新增上的變數,在使用其方法時,跟手動新增的變數(指標型別)方法的原型不一樣。

    ② 新增變數的過程中,還為控制元件建立了相應的原始檔和標頭檔案。

    上網搜了各種關鍵詞,資料少之又少,但感覺還是有點明白了,不知道理解的對不對,但至少臨時能解釋的通,暫且先記下來。

    ① 不一樣的原因在於,手動新增的變數跟類嚮導建立的變數本來就不是一個型別。手動新增的變數是Com(控制元件)中的一個介面(interface)的指標,而類嚮導新增的是控制元件對應的COM物件的變數。稍微瞭解下原理,控制元件就是一個標準的COM物件,而該物件包含了多個介面。手動新增時變數直接指向了物件中的某個介面(此處的介面是COM中的概念,其中會包含多個方法和屬性)。而類嚮導新增的變數是COM物件,使用它其中的方法時呼叫的是控制元件(物件)中預設的介面中的方法,或者是物件對外提供的方法是其中介面的方法的又一層封裝,因此,兩種方式呼叫下原型會有差別。

    ② 新增新的原始檔和標頭檔案肯定是MFC的實現機制的原因,但為什麼在為按鈕等控制元件新增變數時不會出現這種情況呢?有可能是因為控制元件本身分為windows標準控制元件(如按鈕文字框等只能用在MFC中)和ActiveX控制元件(可以用在Web等地方)兩種。而標準控制元件已經在MFC中做了封裝,不需要新增原始檔也會知道他的類結構,而ActiveX控制元件是第三方提供的,為了能新增它的變數,就得需要了解他的型別結構,當然,這應該得需要在實現ActiveX控制元件的時候,還得能告訴使用者如果要宣告變數的話,需要定義成什麼樣的型別。

    在MFC中,標準的使用方式應該是後者也就是使用類嚮導新增變數的方式,而手動新增的方式其實是使用COM的方式。為了能以COM的形式使用,MFC中使用下面的方法步驟:

    ① CWnd *pWnd = GetDlgItem(ID_XXXX); 使用控制元件ID獲取控制元件視窗指標

    ② LPUNKNOWN pUnk = pWnd->GetControlUnknown();返回CWnd物件所代表的OLE控制元件的IUnknown介面的指標。如果這個物件不代表一個OLE控制元件,則返回值為NULL。(IUnknown是COM中的概念,實現COM必須實現的一項)。

    ③ pUnk->QueryInterface(IID_XXXXXXXXX, (LPVOID*)&XXXXXPtr); 將介面與物件指標(第二個引數)關聯。注意第一個引數並不是控制元件在MFC中的ID,而是COM中介面的ID。