MFC控件的颜色设置
在绘制控件颜色时,控件会发送WM_CTLCOLOR消息给父窗口,父窗口收到消息后,映射到OnCtlColor()函数中处理。
该函数返回一个画刷用于设置子控件的背景颜色,子控件再执行自己的CtlColor函数。
这样的话我们就有两种方法设置控件的背景颜色。
一、在父窗口中设置子控件颜色
HBRUSH CTestCtrlColorDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);
if (m_label.m_hWnd == pWnd->m_hWnd)
{
pDC->SetTextColor(RGB(255, 100, 0));
pDC->SetBkColor(RGB(124,124,100));
return (HBRUSH)BLACK_BRUSH;
}
return hbr;
}
其中 pDC和pWnd都是指子控件。nCtlColor表示某一类控件,值以CTLCOLOR_xxx形式表示。
二、直接在子控件中设置颜色。
如果想要在子控件中设置颜色,我们就需要派生一个自己的控件类并重载CtrlColot函数,设置颜色,并且还需要在子控件的头文件中
加入ON_WM_CTLCOLOR_REFLECT宏,如果WM_CTLCOLOR没有被处理,那么该消息将会传递回控件自己这里来处理。
具体处理如下:
BEGIN_MESSAGE_MAP(CMyStatic, CStatic)
ON_WM_CTLCOLOR_REFLECT()
END_MESSAGE_MAP()
HBRUSH CMyStatic::CtlColor(CDC* pDC, UINT nCtlColor)
{
pDC->SetTextColor(RGB(255, 100, 0));
pDC->SetBkColor(RGB(124, 124, 100));
return (HBRUSH)BLACK_BRUSH;
}
三、总结
消息反射对于创建可重用控件类非常重要,它使派生控件具有了 可以独立于付窗口执行自身操作的能力。
派生类控件可以将发送给父窗口未得到处理的消息再作用到自己的成员函数中。
注意:只有父窗口不处理通知时,消息才反射回来,Windows希望父窗口优先接收消息处理。