⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 10.6.4 改变按钮控件的背景色及文本颜色.txt

📁 网上第一本以TXT格式的VC++深入详解孙鑫的书.全文全以TXT格式,并每一章节都分了目录,清晰易读
💻 TXT
字号:
10.6.4 改变按钮控件的背景色及文本颜色

接下来,根据上面的知识,我们按照同样的方法改变Graphic程序中设置对话框上的 OK按钮的背景
色及其文字的颜色。也就是说,在CSettingDlg类的 OnCtlColor函数中,
如果判断出当前绘制的控件的 ID等于 OK按钮的 ID ( IDOK),那么就返回自定义的画刷, 
代码如例  10-32所示。  
例 10-32  

if(pWnd->GetDlgCtrlID ( ) ==IDOK) 

{ 
return m_brush ; 
Build并运行Graphic程序,可是读者将会发现新加的代码并没有起作用, OK按钮的背景色并没有被
改变。那么试着改变一下文字的颜色,在上述例 10-32所示代码的 return语旬之前添加下面这条语
句: 
pDC->SetTextColor(RGB(255 , 0, 0))i 
再次运行 Graphic程序,将会发现添加的代码仍然没有任何作用, OK按钮的背景色和文本颜色都没
有发生改变。可见,对于按钮来说,使用上述方法来改变其背景和文本颜色是无效的,只能寻找其
他的解决方法。实际上,如果想要改变按钮控件的背景色和文本颜色,需要使用CButton类的一个成
员函数: DrawItem,该函数的声明形式如下所示: 
virtual void DrawItem( LPDRAWITEMSTRUCT lpDrawItemStruct ); 
从其声明形式,可以知道这个函数是一个虚函数。当一个自绘制按钮(具有 BS OWNERDRAW风格的按
钮)在绘制时,框架将会调用这个虚函数。因此,如果想要实现一个自绘制按钮控件的绘制,应该重
载这个虚函数。该函数的参数是DRAWITEMSTRUCT 结构类型,其定义如下所示: 
typedef struct tagDRAWITEMSTRUCT { 

UINT CtlType ; 
UINT CtlID; 
UINT itemID ; 
UINT itemAction ; 
UINT itemState; 
HWND hwndltem; 
HDC hDC ; 
RECT rcltem; 
DWORD itemData ; 
} DRAW工TEMSTRUCT;
该结构体中有一个hDC成员,指向将要绘制的按钮的DC。为了绘制这个按钮,可以向该DC中选入自定
义的颜色、画刷等对象。但是有一点读者一定要注意,在此重载函数结束前,一定要恢复hDC中原有
对象。
因此,如果想要改变OK按钮的文本颜色,需要编写一个自己的按钮类,让这个类派 ! 生于CButton
类,并重写Drawltem函数,在此函数中实现按钮背景色和文本颜色的设置。然后,将OK按钮对象与
这个类相关联。这样,在绘制OK按钮时,框架就会调用这个自
定义的按钮类的 Drawltem函数来绘制。
下面我们为 Graphic程序创建一个派生于CButton的类,方法是在VC++界面上选择 <Insert\New 
Class】菜单命令,将弹出如图 10.29所示的NewClass对话框。在此对话框中,在Class乃pe下拉列
表中选择MFC Class,将新增的类命名为(即在Name编辑框中输入): CTestBtn,并将从BaseClass下
拉列表中为其选择基类: CButton。
图 10.29添加一个派生于CButton的新类
这里,在 Graphic工程的 ClassView标签页上就可以看到这个新增的类: CTestBtn了。然后为此类
添加 DrawItem虚函数的重写,井在其中添加实现按钮绘制的代码,结果如例 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按钮关联一个
成员变量。将变量名称设置为 m btnTest,类型选择为 CTestBtn,如图 10 .30所示。

M帽"隙 fV回腼.Ie….: 
E蝇...". 
IControl 面二I 


VW幅嗣-
l口"舶工l 
_: 
", "CTe酬自..-幅恤'阳帽晴圆腼04d…唱
图 10.30为 OK按钮控件添加关联的成员变量 
第 10


之后,单击 Add Member Variable对话框上的【 OK】按钮。系统会提示应在 SettingDIg.h文件中
包含 CTestBtn类的定义文件。因此在 SettingDIg.h文件的前部添加下面这条语句: 
#include "TestBtn.h" 
另外,前面已经介绍过了,自绘制控件应该具有 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虚函数,在此函数中改变按钮的背景色。这个类的功能不是很强,
主要是起-个演示作用,提供给大家做一个参考,读者可以根据需要自行完善。另一个类: CButtonST
是在网上找到的一个按钮类,这个类的功能比较丰富,可以用于实际开发中。 CSXBtn类的头文件及
源文件都位于随书附带光盘本章程序所在的目录下,文件名分别是: SXBtn.h, SXBtn叩p。至于 
CButtonST类,读者可以上搜索引擎搜索" CButtonST"关键字。
使用这两个类的方法是,先两个类的头文件和源文件复制到自己的 Graphic工程所在目录下,并将
它们添加到自己的 Graphic工程中,方法是在 VC++开发环境中打开该工程,然后选择【 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类实现设置对话框上 Cance]按钮的文字颜色和背景色的改变。第一
步,选中该按钮属性对话框上的 Owner draw选项,以便该按钮具有 BS OWNERDRAW风格。第二步,
给这个 Cancel按钮关联一下成员变量,方法是通过 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按钮添加关联的成员变量图 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

按照上面同样的方法为此按钮添加一个关联的成员变量 : m_btnST,并将其类型手工修改为 : 
CButtonST。井在 Settin g Dl g .h文件的前部包含相应的头文件 :
#工 nclude "BtnST . h " . 
与上面设置 OK按钮和 Cancel按钮背景色和文本颜色的实现方法不同的是,使用 CButtonST这个类
时,并不需要通过按钮属性对话框设置其 Ownerdraw选项这个属性,这个类的内部会自动设置 BS 
OWNERDRAW风格。
接下来初始化 m_btnST变量,根据前面的知识,我们知道这可以放到 CS ettingDlg类的 
OnlnitDialog函数中进行,这是 WM INITDIALOG消息的响应函数。但是现在在 CSettingDlg类中还
没有这个消息响应函数,所以需要为该类增加该消息响应函数。
初始化工作包括两个部分 :设置活动时的背景色和前景色,后者也就是按钮活动时文字的颜色。因
此在 OnlnitDialog函数中添加下述代码,将按钮背景色设置为蓝色,前景色设置为红色 : 
ffi_btnST .SetActiveBgColor(RGB(O , O, 255)) ; 

ffi_btnST .SetActiveFgColor(RGB(255 , O, O)) ; 

然后运行 Graphic程序,打开设置对话框,可以看到当把鼠标移动到 ButtonST这个按钮上时,它的
背景色变成蓝色,文字变为红色 (如图 10 . 37所示) ;当把鼠标移走后,该按钮又恢复为原来的颜
色,如图 10.38所示。
|包itll i ll! j飞.:三jhIt inq悟'四主l 


I 
销宽
锦宽


'回t田、5 T,专禀钱
r.~结 
「噩揄 <<~员il.拽 哥1~员
r
F点销 F点撞 
[叫二工士丁f未生二二丁1 
图 10 .3 7鼠标位于 ButtonST按钮图 1 0.38鼠标不位于 Button ST技上时按钮的显示状态 钮上时
按钮的显示状态
还可以调用下面两行函数,设置 ButtonST按钮不活动时的背色和前景色 : 
ffi_btnST .SetlnactiveBgColor(RGB(255 , O, 255)) ; 
ffi_btnST .SetlnactiveFgColor(RGB(255 , 255 , O)) ; 

再次运行 Graphic程序,打开设置对话框,这时就可以看到,对 ButtonST这个按钮来说,当鼠标移
动它的上面时(活动状态)和移走后 (不活动状态),按钮的背景色和文字的颜色都不一样了。读者可
以亲自体验一下。
通过上面的使用,我们可以看到虽然 CButtonST这个类提供的方法很多,但其调用还是比较简单的,
读者可以充分挖掘这个类所提供的功能来完善自己的程序。
, 398 I胁" vc..深λ详解 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -