MFC窗口颜色的设置
本文主要介绍对话框背景色以及控件颜色的设置(SetDialogBkColor()不再被支持)。
对话框背景色的设置
1、重载OnPaint()函数,即WM_PAINT消息,代码如下所示:
void
CtestDlg
:
:OnPaint()
{
if
(IsIconic())
{
CPaintDC dc(
this);
// 用于绘制的设备上下文
SendMessage(WM_ICONERASEBKGND,
reinterpret_cast
<WPARAM
>(dc.GetSafeHdc()),
0);
// 使图标在工作区矩形中居中
int
cxIcon
=
GetSystemMetrics(SM_CXICON);
int
cyIcon
=
GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(
&rect);
int
x
=
(rect.Width()
-
cxIcon
+
1)
/
2;
int
y
=
(rect.Height()
-
cyIcon
+
1)
/
2;
// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
//CDialogEx::OnPaint();
//设置为绿色背景
CRect rect;
CPaintDC dc(
this);
GetClientRect(rect);
dc.FillSolidRect(rect,RGB(
0,
255,
0));
}
}
2、重载OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor),即WM_CTLCOLOR消息:
a)在对话框的.h文件中添加CBrush类的成员m_brush
b)在对话框的.cpp文件中的OnInitDialog()中添加以下代码(背景红色):
m_brush.CreateSolidBrush(RGB(
255,
0,
0));
c)重载OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor),代码如下:
HBRUSH CtestDlg
:
:OnCtlColor(CDC
*
pDC, CWnd
*
pWnd, UINT nCtlColor)
{
HBRUSH hbr
=
CDialogEx
:
:OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: 在此更改 DC 的任何特性
if(nCtlColor
==
CTLCOLOR_DLG)
return m_brush;
//返加红色刷子
// TODO: 如果默认的不是所需画笔,则返回另一个画笔
return
hbr;
}
控件颜色的设置
重载OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor),即WM_CTLCOLOR消息:
HBRUSH CtestDlg
:
:OnCtlColor(CDC
*
pDC, CWnd
*
pWnd, UINT nCtlColor)
{
HBRUSH hbr
=
CDialogEx
:
:OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: 在此更改 DC 的任何特性
// 设置显示字体
CFont
*
font
=
new
CFont;
font
-
>CreateFont(
16,
0,
0,
0,FW_SEMIBOLD,FALSE,FALSE,
0,
ANSI_CHARSET,OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,
DEFAULT_PITCH
&FF_SWISS,_T(
"Arial"));
switch(nCtlColor)
{
case
CTLCOLOR_STATIC
:
//对所有静态文本框的设置
{
pDC
-
>SetBkMode(TRANSPARENT);
//设置背景为透明
pDC
-
>SetTextColor(RGB(
255,
255,
0));
//设置字体颜色
pWnd
-
>SetFont(font);
//设置字体
HBRUSH B
=
CreateSolidBrush(RGB(
125,
125,
255));
//创建画刷
return
(HBRUSH) B;
//返回画刷句柄
}
case
CTLCOLOR_EDIT
:
//对所有编辑框的设置
{
if(IDC_EDIT2
==
pWnd
-
>GetDlgCtrlID())
{
pDC
-
>SetBkMode(TRANSPARENT);
pDC
-
>SetTextColor(RGB(
255,
255,
0));
pWnd
-
>SetFont(font);
HBRUSH B
=
CreateSolidBrush(RGB(
125,
125,
125));
return
(HBRUSH) B;
}
if(IDC_EDIT3
==
pWnd
-
>GetDlgCtrlID())
{
pDC
-
>SetBkMode(TRANSPARENT);
pDC
-
>SetTextColor(RGB(
255,
0,
0));
pWnd
-
>SetFont(font);
HBRUSH B
=
CreateSolidBrush(RGB(
125,
125,
0));
return
(HBRUSH) B;
}
}
default
:
return
CDialog
:
:OnCtlColor(pDC,pWnd, nCtlColor);
}
// TODO: 如果默认的不是所需画笔,则返回另一个画笔
return
hbr;
}
注:
nCtlColor的类别有以下几种:
CTLCOLOR_BTN 按钮控件
CTLCOLOR_DLG 对话框
CTLCOLOR_EDIT 编辑框
CTLCOLOR_LISTBOX 列表框
CTLCOLOR_MSGBOX 消息框
CTLCOLOR_SCROLLBAR 滚动条
CTLCOLOR_STATIC 静态文本