改变界面的背景颜色和改变非按钮控件的背景颜色的道理是一样的,都是在WM_CTLCOLOR消息的响应函数OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 中来改变画刷。
1.首先在构造函数(或者是OnInitDialog函数,负责初始化的函数,也就是在画刷被用到之前对画刷进行初始化都行)中初始化画刷:
CMyClass::CMyClass(CWnd* pParent/* = NULL*/)
: CDialog(AutoSetup::IDD, pParent)
{
//{{AFX_DATA_INIT(AutoSetup)
//}}AFX_DATA_INIT
//设置背景色
backColor = RGB(10, 160, 230);
editBoxColor=RGB(255,255,255);
buttonColor=RGB(10,50,230);
m_backBrush.CreateSolidBrush(backColor);
m_editBoxBrush.CreateSolidBrush(editBoxColor);
m_buttonBrush.CreateSolidBrush(buttonColor);
}
2.添加消息映射,以使得有重画消息发出时可以到相应的函数里面执行我们想要的操作
BEGIN_MESSAGE_MAP(AutoSetup, CDialog)
//{{AFX_MSG_MAP(AutoSetup)
ON_WM_CTLCOLOR()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
3.在WM_CTLCOLOR消息的响应函数OnCtlColor(...)中随心所欲地改变画刷
HBRUSH CMyClass::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);//先将消息交给顶层的类去处理一下,处理完之后就轮到小弟类了
// TODO: Change any attributes of the DC here
pDC->SetBkMode(TRANSPARENT); //设置控件背景透明
hbr=m_backBrush; //创建背景刷子,不管三七得多少,先把画刷变成界面背景的画刷,这样可以使得除了特定控件之外其
//余控件的颜色均与背景颜色相同。
switch(nCtlColor)
{
case CTLCOLOR_EDIT:
// pDC->SetBkMode(TRANSPARENT); //设置控件背景透明
hbr=m_editBoxBrush; //创建背景刷子
break;
case CTLCOLOR_LISTBOX:
//pDC->SetBkColor(buttonColor);
hbr=m_editBoxBrush; //创建背景刷子
break;
default:break;
}
// TODO: Return a different brush if the default is not desired
return hbr;//返回画刷
}