效果圖:
一、基本過程
(1) 首先,打開VC++新建一個基于對話框的空白工程。這個我就不用多做介紹了吧。
(2) 往界面上拉一個ComboBox控件吧,然后不要忘了聲明相應(yīng)的類對象,我們以后的操作可都全靠它了。
(3) 新建一個類,該類是從CComboBox類繼承下來的,類名為:CBSColorComboBox。
接下來就讓我們先來了解一下畫控件的基本原理和過程,也許這個才是本文的原意。大家都知道Windows中所有可視的東西都是畫出來的,那么這個畫畫的內(nèi)部過程又是怎樣的呢?一般畫Windows控件的過程分為三大部分:
第一:在WM_MEASUREITEM消息影射函數(shù)中設(shè)置當(dāng)前要畫的Item的大小尺寸;
第二:在WM_DRAWITEM消息影射函數(shù)中根據(jù)Item的大小尺寸來畫該Item(圖標(biāo)/位圖/字符串等);
第三:在WM_PAINT消息映射函數(shù)中不斷的繪制當(dāng)前的控件內(nèi)容。下面我們針對CBSColorComboBox類的這幾個過程來做個簡單的介紹。
(1) 在WM_MEASUREITEM消息影射函數(shù)中設(shè)定Item的大小尺寸。在這里我們只需要設(shè)置Item的高度即可。這里的高度我們設(shè)置為2倍的系統(tǒng)小ICON的高度(用::GetSystemMetrics(SM_CXSMICON)取得)。
(2) 在WM_DRAWITEM消息影射函數(shù)中根據(jù)Item的大小尺寸來畫該Item的各種信息。你可以在Item的矩形區(qū)域內(nèi)畫各種各樣的信息,例如:圖標(biāo)/位圖/字符串等等。那么有人會疑問:“我們用什么來畫?我們在哪里畫?又如何來畫呢?”。
答案其實都在這個LPDRAWITEMSTRUCT結(jié)構(gòu)中。hDC成員為設(shè)備上下文環(huán)境(HDC),獲得了該設(shè)備句柄也就意味著我們擁有了畫任何位圖/圖標(biāo)/文本的能力;那么接下來的問題就是:我們在哪里來畫呢?答案也很簡單:獲得LPDRAWITEMSTRUCT結(jié)構(gòu)中Item的矩形區(qū)域(rcItem),那么這就是你施展才華的空間了,要充分利用它哦!最后一步就是如何來畫的問題了,說白了就是如何分配每個元素的空間,如何在它們各自的空間上畫出你想要的東西。按照常規(guī)一般分別計算出ICON所占的矩形區(qū)域/文本所占的矩形區(qū)域/位圖的矩形區(qū)域,如果你還有其他元素那么也應(yīng)該計算出該元素所占的矩形區(qū)域/位圖所占的矩形區(qū)域。
接下來我想一切都很簡單了,不外乎CDC類的幾個常用函數(shù):畫圖標(biāo)用DrawIcon;畫位圖用:BitBlt;畫文字用:DrawText等等。如果你覺得視覺上還不夠COOL,你還可以來設(shè)置各個Item的文本顏色,背景顏色,以及圖標(biāo)的突起和凹陷的視覺效果。
二、需要注意的問題:
第一:程序為了消除不斷繪制所帶來的閃爍現(xiàn)象,特意在WM_ERASEBKGND消息中中做了特殊處理;在WM_PAINT消息中直接把組合框的客戶區(qū)當(dāng)成一幅位圖來不斷更新,而不是對ICON區(qū)域和文本區(qū)域分別重繪。
第二:每當(dāng)用戶改變了組合框的當(dāng)前內(nèi)容后,你在畫新的Item之前一定要記得清除前次組合框內(nèi)的內(nèi)容。
第三:如果您想選擇更多的顏色,那么只要選擇組合框中的最后一個Item(More Colors)即可,這個Item是為用戶自定義顏色而專門設(shè)置的。
怎么樣,做自己的控件Easy吧!其實上面的過程適用于菜單Menu/ListBox/Button/ComboBox等大多數(shù)東東的自畫過程。如果你感覺聽起來還是有點不知所云,那么打開工程看看吧,相信你會一目了然!