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 静态文本
=======================================================================
高洪臣 (Gavin Gao)
cggos@outlook.com
=======================================================================
高洪臣 (Gavin Gao)
cggos@outlook.com
=======================================================================