WM_CTLCOLOR,响应函数:CWnd::OnCtlColor
afx_msg HBRUSH OnCtlColor(
CDC* pDC, //当前要绘制的控件的设备上下文的指针
CWnd* pWnd, //当前要绘制的控件的指针
UINT nCtlColor //要绘制的控件的类型
);
1、改变整个对话框及其上子控件的背景色
为程序的“设置”对话框CSettingDlg添加WM_CTLCOLOR命令消息及其消息响应函数:
在对话框类CSettingDlg类中添加私有成员变量:CBrush m_brush,并在CSettingDlg类的构造函数中利用CreateSolidBrush函数将该画刷初始化为蓝色,然后更改消息响应函数OnCtlColor函数中返回的画刷句柄为该自定义的画刷句柄:
CSettingDlg::CSettingDlg(CWnd* pParent /*=NULL*/) : CDialog(CSettingDlg::IDD, pParent) { //{{AFX_DATA_INIT(CSettingDlg) m_brush.CreateSolidBrush(RGB(0,0,255)); //}}AFX_DATA_INIT }
HBRUSH CSettingDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); // TODO: Change any attributes of the DC here // TODO: Return a different brush if the default is not desired //return hbr; return m_brush; }
2、仅改变某个子控件的背景及文本颜色
OnCtlColor函数的第二个参数pWnd可以表明当前绘制的控件是哪个,通过调用CWnd类的GetDlgCtrlID函数得到该控件的ID,若该ID为我们想要改变其背景的控件的ID,则更改OnCtlColor函数的返回画刷句柄为自定义的画刷句柄,否则返回默认画刷句柄;
HBRUSH CSettingDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); // TODO: Change any attributes of the DC here // TODO: Return a different brush if the default is not desired if(pWnd->GetDlgCtrlID()==IDC_LINE_STYLE){ return m_brush; } return hbr; }
若要改变控件上的文本颜色,须在OnCtlColor函数返回画刷句柄之前调用SetTextColor函数修改控件上的文本颜色:
HBRUSH CSettingDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); // TODO: Change any attributes of the DC here // TODO: Return a different brush if the default is not desired //修改组框 if(pWnd->GetDlgCtrlID()==IDC_LINE_STYLE){ pDC->SetTextColor(RGB(255,0,0)); //修改文本颜色 pDC->SetBkMode(TRANSPARENT); //修改文本背景为透明 return m_brush; } //修改编辑框 if(pWnd->GetDlgCtrlID()==IDC_LINE_WIDTH){ pDC->SetTextColor(RGB(255,0,0)); //修改编辑框中文本颜色 pDC->SetBkColor(RGB(0,0,255)); //修改编辑框背景色 return m_brush; } return hbr; }
3、改变按钮控件的背景色及文本颜色
若要改变按钮控件的文本颜色,需要自定义一个派生于CButton类的按钮类,并重写DrawItem虚函数,在此函数中实现按钮背景色和其上文本颜色的设置,然后将需要改变的按钮控件对象与这个自定义的按钮类相关联;
在工程名上右击新建类:
在该新建类上右击添加虚函数DrawItem,并在其中重写按钮绘制代码:
void CTestBtn::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) { // TODO: Add your code to draw the specified item UINT uStyle=DFCS_BUTTONPUSH; ASSERT(lpDrawItemStruct->CtlType==ODT_BUTTON); if(lpDrawItemStruct->itemState & ODS_SELECTED){ uStyle |= DFCS_PUSHED; } ::DrawFrameControl(lpDrawItemStruct->hDC,&lpDrawItemStruct->rcItem,DFC_BUTTON,uStyle); CString strText; GetWindowText(strText); COLORREF crOldColor=::SetTextColor(lpDrawItemStruct->hDC,RGB(255,0,0)); ::DrawText(lpDrawItemStruct->hDC,strText,strText.GetLength(),&lpDrawItemStruct->rcItem,DT_SINGLELINE|DT_VCENTER|DT_CENTER); ::SetTextColor(lpDrawItemStruct->hDC,crOldColor); }
将“设置”对话框的【OK】按钮关联至新的自定义类的成员变量:
会提示要在对话框的头文件中包含自定义类的头文件:
#include "TestBtn.h"
将对话框中【OK】按钮的属性样式中的“所有者绘制”勾选:
运行程序,【OK】按钮的文本已经变成红色;若要改变按钮控件的背景色,须上网百度下载“CButtonST”类,将该类的头文件.h和源文件.cpp放到自己的工程文件夹中,在VC中将类的这两个文件添加到工程;为所要改的按钮控件添加关联的成员变量m_btnST,选择变量类名时没有“CButtonST”类,先随便选择一个,完成变量关联后到按钮所在对话框类的头文件中找到新增变量的定义,手动将其类型改为“CButtonST”,并在对话框头文件中包含“CButtonST”类的头文件;使用CButtonST类时无须更改按钮属性样式为“所有者绘制”;为对话框类添加WM_INITDIALOG消息的响应函数OnInitDialog,在该函数中将按钮的背景色和前景色初始化:
m_btnST.SetActiveBgColor(RGB(0,0,255)); //活动状态的背景色
m_btnST.SetActiveFgColor(RGB(255,0,0)); //活动状态的前景色
m_btnST.SetInactiveBgColor(RGB(255,0,255)); //非活动状态的背景色
m_btnST.SetInactiveFgColor(RGB(255,255,0)); //非活动状态的前景色
4、改变控件上的文本字体
为程序对话框资源添加一个静态文本控件,ID为IDC_TEXT,在程序中修改该控件的文本;
先为对话框类CSettingDlg类添加私有成员变量:CFont m_font,并在CSettingDlg类的构造函数中将其初始化:
CSettingDlg::CSettingDlg(CWnd* pParent /*=NULL*/) : CDialog(CSettingDlg::IDD, pParent) { //{{AFX_DATA_INIT(CSettingDlg) m_font.CreatePointFont(200,"黑体"); //}}AFX_DATA_INIT }
在CSettingDlg类的OnCtlColor函数中判断当前绘制的若为静态文本控件,则将自定义的字体选入设备描述表中,该控件的文本即以新字体显示:
HBRUSH CSettingDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); // TODO: Change any attributes of the DC here // TODO: Return a different brush if the default is not desired if(pWnd->GetDlgCtrlID()==IDC_TEXT){ pDC->SelectObject(&m_font); } return hbr; }