ActiveX控制項的MFC設計之旅

2021-05-27 21:44:45 字數 1665 閱讀 1243

在csdn中碰到了好幾個問使用mfc設計activex控制項的朋友,聯想到自己以前也幹過這事,突然想寫些文章,介紹介紹我所知道的一些設計技巧。

無奈,千頭萬緒,不知如何著手,最後,決定乾脆設計一控制項,將在控制項中碰到的一些問題,一些方法寫出來。想一想,就設計一網格控制項吧,取名為litegrid。

(忘了說了,咱這文稍微還是有點深度的,如果各位想看怎麼新增屬性,事件的,抱歉了,本文不提供)

第乙個要加的酷酷的功能是加上層次結構,看看vb中的好多控制項,都有這種結構,

以listview控制項為例,就有listview1.listitems(0).checked=true

這種以物件作為屬性的結構是怎麼實現的,

網上有資料的,楊老師的

《關於 idispatch 介面的 lpdispatch 屬性的實現》

一文中就有介紹

在msdn中的教程autoclick中也有介紹,

總之呢就是用idispatch作為控制項的屬性就行了。

好了,閒話少說,那咱就開始了:

1.新增乙個派生自ccmdtarget的類ccell,用該類表示網格控制項的一格,注意automation用creatable by type id選項

2.在classwizard中為ccell類新增上屬性text

3.實現text屬性,如下

void ccell::ontextchanged()

4.為clitegrid新增上lpdispatch型別的唯讀帶引數屬性cell(long ncol, long nrow),這個我想一般的都會加吧,就簡單說一下了

在classwizard的automation中的addproperty對話方塊中,

在implementation一項中,選擇get/set methods,

刪除掉set function一項中的所有內容,以設定為唯讀屬性

在parameter list一項中,新增上兩個引數long ncol和long nrow

這裡要宣告兩點,乙個是在vb中integer型別對應的應是short,long型別對應的則是long,另乙個是這裡的帶引數屬性和前面的listview的listitems還是有些不同的,具體的咱以後再談了

5.接下來咱就實現這個cell屬性了

lpdispatch clitegridctrl::getcell(short ncol, short nrow)

說明一下:

ccmdtarget的getidispatch函式原型為

lpdispatch getidispatch( bool baddref );

這裡我們將baddref設為false是因為,在構造ccell時,引用值已經設為1了,而getcell之後,我們就不需要pcell物件了。如果pcell是成員變數,而且在控制項的其它地方還需要它,那麼得設為true。

另外,請注意#include "cell.h",^_^

好了,ok了,編譯一下,我們就在vb中試試吧

新建一vb工程,新增litegrid控制項到窗體上

在form_load中加上如下語句

litegrid1.cell(0,0).text = "元旦快樂"

執行一下看看效果如何

但是,和vb中的其它控制項比較一下,是不是有所不同,.text沒法提示出來,雖然能用,可是沒提示,總覺得差了點什麼吧,怎麼能這個提示弄出來呢,呵呵,且聽下回分解

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

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

MFC中ActiveX控制項的使用

windows系的開發做的很少,也暈乎暈乎的。在mfc中新增上mapcontrol的控制項之後。手動新增乙個imapcontrol2ptr型別的變數,然後用手動新增的變數再去手動的與控制項關聯,才能進一步呼叫或者設定控制項的方法和屬性。我上一次使用mfc是什麼時候來著?貌似很久遠了。不過我依稀記得,...

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

那麼這回就來看一下網上說的挺多的傳遞自定義結構的問題吧,這個問題在早期不支援dcom的作業系統中是沒辦法解決的,不過就目前的流行作業系統來說,應該是不成問題的。第乙個是微軟的msdn,應該蠻正宗的吧,http windowssdk.msdn.microsoft.com library default...