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 静态文本