在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...