?? 10.6.4 改變按鈕控件的背景色及文本顏色.txt
字號:
10.6.4 改變按鈕控件的背景色及文本顏色
接下來,根據(jù)上面的知識,我們按照同樣的方法改變Graphic程序中設置對話框上的 OK按鈕的背景
色及其文字的顏色。也就是說,在CSettingDlg類的 OnCtlColor函數(shù)中,
如果判斷出當前繪制的控件的 ID等于 OK按鈕的 ID ( IDOK),那么就返回自定義的畫刷,
代碼如例 10-32所示。
例 10-32
if(pWnd->GetDlgCtrlID ( ) ==IDOK)
{
return m_brush ;
Build并運行Graphic程序,可是讀者將會發(fā)現(xiàn)新加的代碼并沒有起作用, OK按鈕的背景色并沒有被
改變。那么試著改變一下文字的顏色,在上述例 10-32所示代碼的 return語旬之前添加下面這條語
句:
pDC->SetTextColor(RGB(255 , 0, 0))i
再次運行 Graphic程序,將會發(fā)現(xiàn)添加的代碼仍然沒有任何作用, OK按鈕的背景色和文本顏色都沒
有發(fā)生改變。可見,對于按鈕來說,使用上述方法來改變其背景和文本顏色是無效的,只能尋找其
他的解決方法。實際上,如果想要改變按鈕控件的背景色和文本顏色,需要使用CButton類的一個成
員函數(shù): DrawItem,該函數(shù)的聲明形式如下所示:
virtual void DrawItem( LPDRAWITEMSTRUCT lpDrawItemStruct );
從其聲明形式,可以知道這個函數(shù)是一個虛函數(shù)。當一個自繪制按鈕(具有 BS OWNERDRAW風格的按
鈕)在繪制時,框架將會調(diào)用這個虛函數(shù)。因此,如果想要實現(xiàn)一個自繪制按鈕控件的繪制,應該重
載這個虛函數(shù)。該函數(shù)的參數(shù)是DRAWITEMSTRUCT 結(jié)構(gòu)類型,其定義如下所示:
typedef struct tagDRAWITEMSTRUCT {
UINT CtlType ;
UINT CtlID;
UINT itemID ;
UINT itemAction ;
UINT itemState;
HWND hwndltem;
HDC hDC ;
RECT rcltem;
DWORD itemData ;
} DRAW工TEMSTRUCT;
該結(jié)構(gòu)體中有一個hDC成員,指向?qū)⒁L制的按鈕的DC。為了繪制這個按鈕,可以向該DC中選入自定
義的顏色、畫刷等對象。但是有一點讀者一定要注意,在此重載函數(shù)結(jié)束前,一定要恢復hDC中原有
對象。
因此,如果想要改變OK按鈕的文本顏色,需要編寫一個自己的按鈕類,讓這個類派 ! 生于CButton
類,并重寫Drawltem函數(shù),在此函數(shù)中實現(xiàn)按鈕背景色和文本顏色的設置。然后,將OK按鈕對象與
這個類相關(guān)聯(lián)。這樣,在繪制OK按鈕時,框架就會調(diào)用這個自
定義的按鈕類的 Drawltem函數(shù)來繪制。
下面我們?yōu)?Graphic程序創(chuàng)建一個派生于CButton的類,方法是在VC++界面上選擇 <Insert\New
Class】菜單命令,將彈出如圖 10.29所示的NewClass對話框。在此對話框中,在Class乃pe下拉列
表中選擇MFC Class,將新增的類命名為(即在Name編輯框中輸入): CTestBtn,并將從BaseClass下
拉列表中為其選擇基類: CButton。
圖 10.29添加一個派生于CButton的新類
這里,在 Graphic工程的 ClassView標簽頁上就可以看到這個新增的類: CTestBtn了。然后為此類
添加 DrawItem虛函數(shù)的重寫,井在其中添加實現(xiàn)按鈕繪制的代碼,結(jié)果如例 10-33所示。
例 10-33
void CTestBtn : : Drawltem(LPDRAWITEMSTRUCT lpDrawltemStruct)
{
// TODO : Add your code to draw the specified item
UINT uStyle = DFCS_BUTTONPUSH ;
11 This code only works with buttons .
ASSERT(lpDrawltemStruct->CtlType ODT_BUTTON) ;
11if drawing selected, add the pushed style to DrawFrameControl .
if (lpDrawltemStruct->itemState & ODS_ SELECTED)
uStyle 1= DFCS_ PUSHED ;
// Draw t he button frame .
: : DrawFrameControl (lpDrawltemStruct->hDC ,
&lpDrawltemStruct->rcltem, DFC_ BUTTON, uStyle) ;
11 Get the button's text .
CString strText ; '.
GetWindowTex t(strText) ;
11 Draw the button text using the text color red . COLORREF crOldColor = ::
SetTextColor(lpDrawltemStruct->hDC , RGB(255 , 0 , 0)); : : DrawText
(lpDrawltemStruct->hDC , strText , strText . GetLength() , &lpDraw工 temStruct->rcltem,
DT_SINGLELINEIDT_VCENTERIDT_ CENTER) ; :: SetTextColor(lpDrawltemStruct->hDC ,
crOldColor) ;
接下來,利用 ClassWizard打開 Add Member Variable對話框,為設置對話框上的 OK按鈕關(guān)聯(lián)一個
成員變量。將變量名稱設置為 m btnTest,類型選擇為 CTestBtn,如圖 10 .30所示。
M帽"隙 fV回靦.Ie….:
E蠅...".
IControl 面二I
VW幅嗣-
l口"舶工l
_:
", "CTe酬自..-幅恤'陽帽晴圓靦04d…唱
圖 10.30為 OK按鈕控件添加關(guān)聯(lián)的成員變量
第 10
之后,單擊 Add Member Variable對話框上的【 OK】按鈕。系統(tǒng)會提示應在 SettingDIg.h文件中
包含 CTestBtn類的定義文件。因此在 SettingDIg.h文件的前部添加下面這條語句:
#include "TestBtn.h"
另外,前面已經(jīng)介紹過了,自繪制控件應該具有 BS OWNERDRAW風格,這可以通過控件屬性對話框中
的 Owner draw選項來設置。打開 OK按鈕的屬性對話框,并打開 Styles標簽頁,選中 Ownerdraw
選項即可。如圖 10.31所示。
Build井運行 Graphic程序,打開設置對話框,這時可以看到 OK按鈕的文字變成紅色
的了。如圖 10.32所示。
h l1IIID1 可唱唱且』
止」
蛐罩
2旦~
-
r. '
咽'缸..... ...... I ExWMed S1)4e. J 「匾蟲'
稅~雖
rDel響曲.. I r刷刷.. "啊t...帽'劇增...ot: ,,6.錦
v屆豆豆亟「蜘曲F函γ一一丁
「幅.. r F10t V咽陽I ..Ig.....ent:
來倒
r 811 . I Oefautt一一-::J
圖 10.31設置 OK按鈕的 Ownerdraw屬性 圖 10.32 OK按鈕文字顏色的改變
為了改變 OK按鈕的背景色,這里筆者為大家提供兩個類,一個是筆者以前編寫的一個按鈕類:
CSXBtn,在該類中重寫了 DrawItem虛函數(shù),在此函數(shù)中改變按鈕的背景色。這個類的功能不是很強,
主要是起-個演示作用,提供給大家做一個參考,讀者可以根據(jù)需要自行完善。另一個類: CButtonST
是在網(wǎng)上找到的一個按鈕類,這個類的功能比較豐富,可以用于實際開發(fā)中。 CSXBtn類的頭文件及
源文件都位于隨書附帶光盤本章程序所在的目錄下,文件名分別是: SXBtn.h, SXBtn叩p。至于
CButtonST類,讀者可以上搜索引擎搜索" CButtonST"關(guān)鍵字。
使用這兩個類的方法是,先兩個類的頭文件和源文件復制到自己的 Graphic工程所在目錄下,并將
它們添加到自己的 Graphic工程中,方法是在 VC++開發(fā)環(huán)境中打開該工程,然后選擇【 Project\Add
To Project\Files. ..】菜單項,這時會彈出如圖 10.33所示的向工程中插入文件的對話框,找到
將要插入的文件所在目錄,然后選中它們,單擊 (OK】按鈕即可。
.tJ2!1
董翩, ω|仙aphic 3+-l!J ct因·
In墨en In1O: IGraphlc 3
M
圖 10 .3 3向工程插入文件
396 I紗'
vc忡深λ
這時,在 Graphic工程左邊的 ClassView標簽頁上就可以看到這兩個類 : CSXBtn和 CButtonST。接
下來,介紹一下在 Graphic程序中如何使用這兩個類。
首先利用 CSXBtn類實現(xiàn)設置對話框上 Cance]按鈕的文字顏色和背景色的改變。第一
步,選中該按鈕屬性對話框上的 Owner draw選項,以便該按鈕具有 BS OWNERDRAW風格。第二步,
給這個 Cancel按鈕關(guān)聯(lián)一下成員變量,方法是通過 ClassWizard打開增加成員變量的對話框,如圖
所示。將該變量命名為 ffi_btnCancel.但從變量類型下拉列表框中選擇變量類型時(如圖 10.34所
示),卻找不到所需的 CSXBtn類。這里可以先隨便從中選擇一種類型,單擊 OK按鈕完成新變量的添
加。然后到 CSettingDlg類的頭文件 SettingDlg.h中打開剛才新增變量的定義,手工將其類型修改
為 CSXBtn。這時還需要包含該類的頭文件,即在 SettingDlg.h文件的前部添加下面這行代碼 :
#include "SXBtn.h"
Build并運行 Graphic程序,打開設置對話框,這里可以看到 Cancel按鈕的背景色變成了綠色,文
字是紅色的 (如圖 10.35所示 )。這是利用筆者提供的 CSXBtn類完成的設置按鈕背景色和文字顏色
的功能。
IA.t.\ "1 ..mh..,函牛1二 I!E:" .!J2!l 軍儼怕呵 γ?哩'主j
We..ber YaflMIe ..",e:
Im_btn C .n白' 丘J線寬
,..噸·市 巳巳」
IC.n".' .:J
v......ble type: 8實拽
比搖n .:J 「虛鎖 ~1~員
l CT..舊tn
F點鱗
。..四tptlon:
..., to C8 un…"帽 ...ber
c=
圖 10 . 34為 Cance l按鈕添加關(guān)聯(lián)的成員變量圖 10 . 3 5 Can ce1按鈕背景色和文本顏色的改變
為了演示 CButtonST類的使用,在 Graphic程序中的設置對話框資源上再添加一個按鈕控件,將其
ID設置為 IDC_BTN_ST, Caption設置為 : ButtonST。這時的設置對話框資源如圖 10.36所示。
些些些一二二 n 1;'"型主j
t「 ;11韶
;i lm:
i盧 i:
圖 1 0.36添加的 ButtonST按鈕
I 397
第 10
按照上面同樣的方法為此按鈕添加一個關(guān)聯(lián)的成員變量 : m_btnST,并將其類型手工修改為 :
CButtonST。井在 Settin g Dl g .h文件的前部包含相應的頭文件 :
#工 nclude "BtnST . h " .
與上面設置 OK按鈕和 Cancel按鈕背景色和文本顏色的實現(xiàn)方法不同的是,使用 CButtonST這個類
時,并不需要通過按鈕屬性對話框設置其 Ownerdraw選項這個屬性,這個類的內(nèi)部會自動設置 BS
OWNERDRAW風格。
接下來初始化 m_btnST變量,根據(jù)前面的知識,我們知道這可以放到 CS ettingDlg類的
OnlnitDialog函數(shù)中進行,這是 WM INITDIALOG消息的響應函數(shù)。但是現(xiàn)在在 CSettingDlg類中還
沒有這個消息響應函數(shù),所以需要為該類增加該消息響應函數(shù)。
初始化工作包括兩個部分 :設置活動時的背景色和前景色,后者也就是按鈕活動時文字的顏色。因
此在 OnlnitDialog函數(shù)中添加下述代碼,將按鈕背景色設置為藍色,前景色設置為紅色 :
ffi_btnST .SetActiveBgColor(RGB(O , O, 255)) ;
ffi_btnST .SetActiveFgColor(RGB(255 , O, O)) ;
然后運行 Graphic程序,打開設置對話框,可以看到當把鼠標移動到 ButtonST這個按鈕上時,它的
背景色變成藍色,文字變?yōu)榧t色 (如圖 10 . 37所示) ;當把鼠標移走后,該按鈕又恢復為原來的顏
色,如圖 10.38所示。
|包itll i ll! j飛.:三jhIt inq悟'四主l
I
銷寬
錦寬
'回t田、5 T,專稟錢
r.~結(jié)
「噩揄 <<~員il.拽 哥1~員
r
F點銷 F點撞
[叫二工士丁f未生二二丁1
圖 10 .3 7鼠標位于 ButtonST按鈕圖 1 0.38鼠標不位于 Button ST技上時按鈕的顯示狀態(tài) 鈕上時
按鈕的顯示狀態(tài)
還可以調(diào)用下面兩行函數(shù),設置 ButtonST按鈕不活動時的背色和前景色 :
ffi_btnST .SetlnactiveBgColor(RGB(255 , O, 255)) ;
ffi_btnST .SetlnactiveFgColor(RGB(255 , 255 , O)) ;
再次運行 Graphic程序,打開設置對話框,這時就可以看到,對 ButtonST這個按鈕來說,當鼠標移
動它的上面時(活動狀態(tài))和移走后 (不活動狀態(tài)),按鈕的背景色和文字的顏色都不一樣了。讀者可
以親自體驗一下。
通過上面的使用,我們可以看到雖然 CButtonST這個類提供的方法很多,但其調(diào)用還是比較簡單的,
讀者可以充分挖掘這個類所提供的功能來完善自己的程序。
, 398 I脅" vc..深λ詳解
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -