转自:http://hi.baidu.com/sicceer/item/f17eca08d72d88f1a1103467
CtlColor消息的用法
很多人都觉得自己的程序的界面不那么美观,往往VC默认产生的对话框比较单调,因此很多人往往找到很多其它的控件对对话框进行美化修饰,例如给静态控件设置字体,设置背景颜色等等,其实这些完全可以由VC自己的WM_CTLCOLOR消息来完成!
WM_CTLCOLOR 消息,使你可以告诉Windows在画各种控件的背景时用什么刷子。在Windows要画控件的时候,它发送WM_CTLCOLOR给控件的父窗口。这是你改变控件背景的好机会。
WM_CTLCOLOR消息用来完成对EDIT、STATIC、BUTTON等控件设置背景和字体颜色,其用法如下:
1.首先在自己需要设置界面的对话框上点击右键-->在右侧属性栏中加入WM_CTLCOLOR消息-->自动生成OnCtlColor()函数,此函数可以对本对话框的控件的界面外观做修饰,用法如下: 将类向导产生的函数做如下修改:
HBRUSH CDialogColor::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr = CDialog::OnCtlColor(pDC,pWnd, nCtlColor);// TODO: Change any attributes of theDC here //设置显示字体 CFont * cFont=new CFont; cFont->CreateFont(16,0,0,0,FW_SEMIBOLD,FALSE,FALSE,0, ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH&FF_SWISS,"Arial"); //对特定的控件做修改 switch(nCtlColor){ case CTLCOLOR_STATIC: //对所有静态文本控件的设置 {pDC->SetBkMode(TRANSPARENT); //设置背景为透明 pDC->SetTextColor(RGB(255,255,0)); //设置字体颜色 pWnd->SetFont(cFont); //设置字体 HBRUSH B = CreateSolidBrush(RGB(125,125,255)); //创建画刷 return (HBRUSH) B; //返回画刷句柄 } case CTLCOLOR_EDIT: //对所有编辑框的设置 {pDC->SetBkMode(TRANSPARENT); pDC->SetTextColor(RGB(255,255,0)); pWnd->SetFont(cFont); HBRUSH B = CreateSolidBrush(RGB(125,125,255)); return (HBRUSH) B; } default:return CDialog::OnCtlColor(pDC,pWnd, nCtlColor);}} 注:case的类别有以下几种: CTLCOLOR_BTN 按钮控件 CTLCOLOR_DLG 对话框 CTLCOLOR_EDIT 编辑框 CTLCOLOR_LISTBOX 列表框 CTLCOLOR_MSGBOX 消息框 CTLCOLOR_SCROLLBAR 滚动条 CTLCOLOR_STATIC 静态文本
2.你可能觉得对所有的控件使用统一的界面设置觉得不自由,其实VC同样可以对特定的ID的控件进行设置,方法如下: switch (pWnd->GetDlgCtrlID()) { //针对ID为IDC_CTL1、IDC_CTL2和IDC_CTL3的控件进行同样的设置 case IDC_CTL1: case IDC_CTL2: case IDC_CTL3: {pDC->SetBkMode(TRANSPARENT); pDC->SetTextColor(RGB(255,255, 0)); pWnd->SetFont(cFont); HBRUSH B = CreateSolidBrush(RGB(125,125,255)); return (HBRUSH) B; } default: return CDialog::OnCtlColor(pDC, pWnd, nCtlColor); } 通过消息WM_CTLCOLOR我们可以改变对话框或一些特殊控件的背景颜色 1、添加WM_CTLCOLOR消息映射。 2、在CWnd::OnCtlColor里面作相应的处理 HRESULT CWnd::OnCtlColor(CDC *pDC, CWnd *pWnd, UINT nCtlColor){ switch (nCtlColor) { case CTLCOLOR_BTN: // Button control { pDC->SetBkColor( RGB( 255, 0, 0) ); } break; case CTLCOLOR_DLG: // Dialog box break; case CTLCOLOR_EDIT: // Edit control { COLORREF bkColor = RGB(255,0,0); CRect rect; pWnd->GetClientRect(&rect); CBrush br; br.CreateSolidBrush(bkColor); pDC->FillRect(rect, &br); pDC->SetBkColor(bkColor); break; case CTLCOLOR_LISTBOX: // List-box control break; case CTLCOLOR_MSGBOX: // Message box break; case CTLCOLOR_SCROLLBAR: // Scroll-bar control break; case CTLCOLOR_STATIC: // Static control break; default: break; } return CWnd::OnCtlColor(pDC, pWnd, nCtlColor);}
------------------------------------------------------------------------------------------------------------------------
OnCtlColor函数来改变控件颜色
在MFC类库提供了 CWnd::OnCtlColor 函数,在工作框架的子窗口被重画时将调用该成员函数.因此可以重载 WM_CTLCOLOR 消息的响应函数.此函数的原型:afx_msg HBRUSH OnCtlColor(CDC *pDC,CWnd *pWnd,UINT nCtlColor); 参数nCtlColor用于指定控件的类型,可以是: .CTLCOLOR_BTN 按钮控件 .CTLCOLOR_DLG 对话框 .CTLCOLOR_EDIT 编辑框 .CTLCOLOR_LISTBOX 列表控件 .CTLCOLOR_MSGBOX 消息控件 .CTLCOLOR_SCROLLBAR 滚动条控件 .CTLCOLOR_STATIC 静态控件 [程序实现] 假设你已有了名为My的对话框工程.你有了一个STATIC的控件,ID为IDC_STATIC1. HBRUSH CMyDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); // TODO: Change any attributes of the DC here if (nCtlColor==CTLCOLOR_STATIC)
{ pDC->SetTextColor(RGB(255,0,0)); //字体颜色 pDC->SetBkColor(RGB(0, 0, 255)); //字体背景色
} // TODO: Return a different brush if the default is not desired return hbr; }
如果要指定某个特定控件可以这样写:ID为IDC_STATIC1
if (pWnd->GetDlgCtrlID()==IDC_STATIC1) { pDC->SetTextColor(RGB(255,0,0)); //设置字体颜色 pDC->SetBkMode(TRANSPARENT); //设置字体背景为透明 // TODO: Return a different brush if the default is not desired return (HBRUSH)::GetStockObject(BLACK_BRUSH); // 设置背景色 } else return hbr;
【注】
BLACK_BRUSH:黑色
WHITE_BRUSH:白色
GRAY_BRUSH:灰色
NULL_BRUSH:透明
HOLLOW_BRUSH :透明
附:常用色值
R
|
G
|
B
|
值
|
R
|
G
|
B
|
值
|
R
|
G
|
B
|
值
|
|||
黑色
|
0
|
0
|
0
|
#000000
|
黄色
|
255
|
255
|
0
|
#FFFF00
|
浅灰蓝色
|
176
|
224
|
230
|
#B0E0E6
|
象牙黑
|
41
|
36
|
33
|
#292421
|
香蕉色
|
227
|
207
|
87
|
#E3CF57
|
品蓝
|
65
|
105
|
225
|
#4169E1
|
灰色
|
192
|
192
|
192
|
#C0C0C0
|
镉黄
|
255
|
153
|
18
|
#FF9912
|
石板蓝
|
106
|
90
|
205
|
#6A5ACD
|
冷灰
|
128
|
138
|
135
|
#808A87
|
dougello
|
235
|
142
|
85
|
#EB8E55
|
天蓝
|
135
|
206
|
235
|
#87CEEB
|
石板灰
|
112
|
128
|
105
|
#708069
|
forum gold
|
255
|
227
|
132
|
#FFE384
|
|
|
|
|
|
暖灰色
|
128
|
128
|
105
|
#808069
|
金黄色
|
255
|
215
|
0
|
#FFD700
|
青色
|
0
|
255
|
255
|
#00FFFF
|
|
|
|
|
|
黄花色
|
218
|
165
|
105
|
#DAA569
|
绿土
|
56
|
94
|
15
|
#385E0F
|
白色
|
255
|
255
|
255
|
#FFFFFF
|
瓜色
|
227
|
168
|
105
|
#E3A869
|
靛青
|
8
|
46
|
84
|
#082E54
|
古董白
|
250
|
235
|
215
|
#FAEBD7
|
橙色
|
255
|
97
|
0
|
#FF6100
|
碧绿色
|
127
|
255
|
212
|
#7FFFD4
|
天蓝色
|
240
|
255
|
255
|
#F0FFFF
|
镉橙
|
255
|
97
|
3
|
#FF6103
|
青绿色
|
64
|
224
|
208
|
#40E0D0
|
白烟
|
245
|
245
|
245
|
#F5F5F5
|
胡萝卜色
|
237
|
145
|
33
|
#ED9121
|
绿色
|
0
|
255
|
0
|
#00FF00
|
白杏仁
|
255
|
235
|
205
|
#FFFFCD
|
桔黄
|
255
|
128
|
0
|
#FF8000
|
黄绿色
|
127
|
255
|
0
|
#7FFF00
|
cornsilk
|
255
|
248
|
220
|
#FFF8DC
|
淡黄色
|
245
|
222
|
179
|
#F5DEB3
|
钴绿色
|
61
|
145
|
64
|
#3D9140
|
蛋壳色
|
252
|
230
|
201
|
#FCE6C9
|
|
|
|
|
|
翠绿色
|
0
|
201
|
87
|
#00C957
|
花白
|
255
|
250
|
240
|
#FFFAF0
|
棕色
|
128
|
42
|
42
|
#802A2A
|
森林绿
|
34
|
139
|
34
|
#228B22
|
gainsboro
|
220
|
220
|
220
|
#DCDCDC
|
米色
|
163
|
148
|
128
|
#A39480
|
草地绿
|
124
|
252
|
0
|
#7CFC00
|
ghostWhite
|
248
|
248
|
255
|
#F8F8FF
|
锻浓黄土色
|
138
|
54
|
15
|
#8A360F
|
酸橙绿
|
50
|
205
|
50
|
#32CD32
|
蜜露橙
|
240
|
255
|
240
|
#F0FFF0
|
锻棕土色
|
135
|
51
|
36
|
#873324
|
薄荷色
|
189
|
252
|
201
|
#BDFCC9
|
象牙白
|
250
|
255
|
240
|
#FAFFF0
|
巧克力色
|
210
|
105
|
30
|
#D2691E
|
草绿色
|
107
|
142
|
35
|
#6B8E23
|
亚麻色
|
250
|
240
|
230
|
#FAF0E6
|
肉色
|
255
|
125
|
64
|
#FF7D40
|
暗绿色
|
48
|
128
|
20
|
#308014
|
navajoWhite
|
255
|
222
|
173
|
#FFDEAD
|
黄褐色
|
240
|
230
|
140
|
#F0E68C
|
海绿色
|
46
|
139
|
87
|
#2E8B57
|
old lace
|
253
|
245
|
230
|
#FDF5E6
|
玫瑰红
|
188
|
143
|
143
|
#BC8F8F
|
嫩绿色
|
0
|
255
|
127
|
#00FF7F
|
海贝壳色
|
255
|
245
|
238
|
#FFF5EE
|
肖贡土色
|
199
|
97
|
20
|
#C76114
|
|
|
|
|
|
雪白
|
255
|
250
|
250
|
#FFFAFA
|
标土棕
|
115
|
74
|
18
|
#734A12
|
紫色
|
160
|
32
|
240
|
#A020F0
|
|
|
|
|
|
乌贼墨棕
|
94
|
38
|
18
|
#5E2612
|
紫罗蓝色
|
138
|
43
|
226
|
#8A2BE2
|
红色
|
255
|
0
|
0
|
#FF0000
|
赫色
|
160
|
82
|
45
|
#A0522D
|
jasoa
|
160
|
102
|
211
|
#A066D3
|
砖红
|
156
|
102
|
31
|
#9C661F
|
马棕色
|
139
|
69
|
19
|
#8B4513
|
湖紫色
|
153
|
51
|
250
|
#9933FA
|
镉红
|
227
|
23
|
13
|
#E3170D
|
沙棕色
|
244
|
164
|
96
|
#F4A460
|
淡紫色
|
218
|
112
|
214
|
#DA70D6
|
珊瑚色
|
255
|
127
|
80
|
#FF7F50
|
棕褐色
|
210
|
180
|
140
|
#D2B48C
|
梅红色
|
221
|
160
|
221
|
#DDA0DD
|
耐火砖红
|
178
|
34
|
34
|
#B22222
|
|
|
|
|
|
|
|
|
||
印度红
|
176
|
23
|
31
|
#B0171F
|
蓝色
|
0
|
0
|
255
|
#0000FF
|
|
|
|
||
栗色
|
176
|
48
|
96
|
#B03060
|
钴色
|
61
|
89
|
171
|
#3D59AB
|
|
|
|
||
粉红
|
255
|
192
|
203
|
#FFC0CB
|
dodger blue
|
30
|
144
|
255
|
#1E90FF
|
|
|
|
||
草莓色
|
135
|
38
|
87
|
#872657
|
jackie blue
|
11
|
23
|
70
|
#0B1746
|
|
|
|
||
橙红色
|
250
|
128
|
114
|
#FA8072
|
锰蓝
|
3
|
168
|
158
|
#03A89E
|
|
|
|
||
蕃茄红
|
255
|
99
|
71
|
#FF6347
|
深蓝色
|
25
|
25
|
112
|
#191970
|
|
|
|
||
桔红
|
255
|
69
|
0
|
#FF4500
|
孔雀蓝
|
51
|
161
|
201
|
#33A1C9
|
|
|
|
||
深红色
|
255
|
0
|
255
|
#FF00FF
|
土耳其玉色
|
0
|
199
|
140
|
#00C78C
|