1. 程式人生 > >MFC中自繪Tab Control 和Button Control

MFC中自繪Tab Control 和Button Control

    按照慣例,先上效果圖:

     最終想要的介面效果如圖中所示,整個對話方塊背景顏色可變,Tab選項卡背景顏色可變,Button的背景顏色可變。實際上Tab control包含四部分:標籤、標籤文字、標籤文字背景、選項卡背景,四部分的顏色均可DIY。對於Button,同理。但對於兩種控制元件,要想DIY控制元件背景顏色,相同點是必須開“自繪屬性”,不同點是自繪的方式不同,所謂殊途同歸。可在重繪兩種控制元件的漫長歲月裡,真的對MFC的介面編輯功能無力吐槽,簡直是寸步難行,說不定哪個斷點處就會“斷言失敗”,MFC這種東西還是要從最底層的類學起,起碼能知道檢索MSDN中的哪一項。

資源連結:點選開啟連結 http://download.csdn.net/download/qq_15522447/10273331


言歸正傳。。。。。。。。。。。。。。。。。。。。。。。

LZ 的開發環境是win7,vs2010.

控制元件自繪:MFC中規定,部分控制元件自繪使用OnDrawItem()函式,另一部分使用DrawItem()函式;這是MFC介面操作中的一個雞肋,這就會有可能導致當使用OnDrawItem()自繪的控制元件與使用DrawItem()自繪的控制元件需要共存時,可能會產生不可預知的問題,實際上是預知的。當主視窗添加了OnDrawItem()詳細對映,同時在派生類中過載DrawItem()時,編譯通過,但DrawItem()中的程式碼不完整執行,具體什麼效果見下文。

(一)Tab的自繪,關鍵點有二:(1)設定控制元件自繪屬性(2)過載DrawItem()函式。

STEP1:控制元件屬性 Owner Draw Fixed  --> TRUE       Style  -->  Fixed Width  控制元件屬性再找不到,面壁!

STEP2:派生CTabCtrl類

    過載DrawItem()函式。

派生類中,新增OnEraseBkgnd()訊息處理函式。派生類中標頭檔案、cpp檔案中的程式碼

呼叫時,只需在主視窗中宣告類,在OnInitDialog()函式中新增下圖中程式碼即可:

效果為


(二)Button自繪

button自繪網上的教程比較多,這裡就不再贅述,主視窗類中新增OnDrawItem()函式即可,直接上程式碼截圖,別忘了,設定Button控制元件的自繪屬性!

OK,難點來了,若是想要兩種自繪控制元件共存呢?

先上兩張失敗的圖片吧。

       若將上述兩種自繪的程式碼強行結合在一起,就會出現上圖右中的效果,效果是出來了,但是卻激發了斷點,跟蹤斷點最後定位到user32.dll上,具體是啥實在是弄不懂。於是嘗試關掉Tab的自繪,出現了左圖中的效果。

       經過幾番摸索,大致明白了OnDrawItem與DrawItem的作用原理,若兩者共存,兩者均會執行,但是兩者會有一個執行順序,這也就是上述紅色文字的由來。兩者的共同點就是,在實行函式體的時候都會對視窗進行重繪,而兩者重繪的內容是有區別的。DrawItem只負責Tab中四個部分中再重繪,OnDrawItem負責整個視窗的重繪,但是OnDrawItem重繪時遺漏了對Tab中標籤文字、標籤文字背景、標籤的重繪。所以,只需在OnDrawItem中新增上該部分即可。

       程式碼如下圖。