MFC中ActiveX控制項的使用

2021-07-09 11:39:04 字數 1275 閱讀 7805

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

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

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

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

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

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

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

① cwnd *pwnd = getdlgitem(id_***x); 使用控制項id獲取控制項視窗指標

② lpunknown punk = pwnd->getcontrolunknown();返回cwnd物件所代表的ole控制項的iunknown介面的指標。如果這個物件不代表乙個ole控制項,則返回值為null。(iunknown是com中的概念,實現com必須實現的一項)。

③ punk->queryinte***ce(iid_*********, (lpvoid*)&***xxptr); 將介面與物件指標(第二個引數)關聯。注意第乙個引數並不是控制項在mfc中的id,而是com中介面的id。

ActiveX控制項的MFC設計之旅

在csdn中碰到了好幾個問使用mfc設計activex控制項的朋友,聯想到自己以前也幹過這事,突然想寫些文章,介紹介紹我所知道的一些設計技巧。無奈,千頭萬緒,不知如何著手,最後,決定乾脆設計一控制項,將在控制項中碰到的一些問題,一些方法寫出來。想一想,就設計一網格控制項吧,取名為litegrid。忘...

ActiveX控制項的MFC設計之旅 第13步

在vb的屬性檢視中,還有乙個有意思的功能是將屬性列在不同的類別,如,外觀,行為,資料等等。這種功能是怎麼來的,我自己的控制項中的自定義的屬性是不是也能列在這些類別中,我能不能建立自己的類別呢。很簡單,在你的控制項中實現乙個介面icategorizeproperties就可以了,這個介面只有兩個方法 ...

使atl開發的activex控制項不彈指令碼安全提示

1.在標頭檔案加入 com inte ce entry iobjectsafety public iobjectsafetyimpl stdmethod getinte cesafetyoptions refiid riid,dword pdwsupportedoptions,dword pdwen...