WTL 中的COwnerDraw應用

2021-08-28 13:48:36 字數 1251 閱讀 2726

cownerdraw是wtl為使用者提供為自畫和定製外觀控制項的模板類,最近被這個類搞的暈頭轉向,其實關鍵的東西也只是那麼一點點.

自畫需要響應四個訊息:wm_measureitem, wm_drawitem, wm_compareitem, 和wm_deleteitem,在atlframe.h標頭檔案中定義的cownerdraw類可以簡化這些工作,使用這個類就不需要處理這四個訊息,你只需將訊息鏈入cownerdraw,它會呼叫你的類中的過載函式。

如何將訊息鏈入cownerdraw取決與你是否將訊息反射給控制項,兩種方法有些不同。

chain_msg_map(cownerdraw)

上面這種直接將訊息鏈入cownerdraw

chain_msg_map_alt(cownerdraw,  1) 

default_reflection_handler()

如果你想要控制項自己處理這些訊息,你需要使用chain_msg_map_alt巨集將訊息鏈入alt_msg_map(1)部分,如上.

上面這些網上的教程都有.下面我要說的就是教程裡沒有的(太簡單了,應該屬於常識,人家的教程就沒寫進去,一致於像我這樣的菜鳥搞了很長的時間,希望能幫助和我一樣的菜鳥,呵呵)

首先,想要把你自己實現個控制項類和資源編輯器中的控制項聯絡起來,你不光要做的是 attach()(用這個關聯有問題,原因還不知道)和 subclasswindow(),你還得必須把你控制項的屬性中的owner draw的屬性設為true,才能和你控制項關聯起來,做了例子試試吧!(是不是太簡單了,我用了兩天時間才發現的).

第二個關鍵,現在的執行程式發現owner draw的屬性為true的控制項都顯示不出來,乙個原因是你過載的drawitem(lpdrawitemstruct lpdis)函式是個空函式,一般情況下如果你要自畫控制項是應該在這裡用gdi畫的,可是你發現你已經把所要花的內容寫好了,還是看不見.原因是我們的程式缺少乙個巨集   

begin_msg_map(cmaindlg)

reflect_notifications()(少了這個巨集)

end_msg_map() 

這是這個巨集的全貌

#define reflect_notifications() \

這個巨集呼叫的是函式 cwindowimplroot::reflectnotifications。這個函式通過引數取得傳送事件控制項的窗體控制代碼,並通過該控制代碼將事件發還給控制項.

最後還有一點不是所有的控制項都可以用cownerdraw來自繪控制項的,只有5個控制項(menu,listbox,combobox,button,static)支援.

WTL 中的COwnerDraw應用

cownerdraw是wtl為使用者提供為自畫和定製外觀控制項的模板類,最近被這個類搞的暈頭轉向,其實關鍵的東西也只是那麼一點點.自畫需要響應四個訊息 wm measureitem,wm drawitem,wm compareitem,和wm deleteitem,在atlframe.h標頭檔案中定...

WTL 3 關於WTL的一些話題

wtl 關於wtl的一些話題 1.選擇mfc還是wtl 建議選擇wtl wtl比mfc入門簡單。wtl 量小,就是sdk程式的稍微封裝,對於理解程式的這個框架很方便。mfc顯得臃腫複雜 wtl從atl擴充套件,只是作的介面擴充套件,在wtl裡,內建對com的支援,使用com元件相當方便 當用atl做...

WTL 除錯輸出的問題

初學wtl,以前在c 中輸出都是利用如下方式進行輸出。include using namespace std std cout this is a test.endl 後來才明白,這個僅限輸出控制台。當然也跟ide 工具有關,visual stdio 的控制台輸出 和 輸出查詢視窗 不一樣。wtl ...