最近要写一个MFC的对话框程序,发现要把MFC的对话框写的有色彩点并不容易,不像在C#里设置属性指就好,而是要自己去写一些代码完成对话框的绘画操作。比如一个简单的鼠标移入、移出操作,都要自己去写代码。由于我只用到了Button和Static两种控件,一切看上去还是比较顺利,所以谈谈自己的经验。
1、对话框的背景
MFC中没有属性能够设定对话框的背景颜色或是图片,需要我们在程序中进行操作。首先,需要实现WM_CTLCOLOR的消息操作,通过这个消息我们能够控制对话框
以及Static控件(包括Group)
的背景色、前景色。该消息的处理函数原型如下:
HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
其中,通过pDC能够文件的颜色、背景模式,通过pWnd可以获取正在绘制的控件ID,通过nCtlColor可以判断当前正在绘制的控件类型。这里我需要控制对话框的背景,所以要进行如下操作:
HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);
if (nCtlColor == CTLCOLOR_DLG)
{
return m_backgroundBrush; //返回对话框背景的画刷
}
else if (
nCtlColor == CTLCOLOR_STATIC
)
{
pDC->SetBkMode(TRANSPARENT); //所有Static控件的背景色为透明
if (pWnd->GetDlgCtrlID() == IDC_NOTE
)
{
pDC->SetTextColor(RGB(255, 255, 255)); //针对特殊的static控件,设置单独的文字颜色
}
}
return hbr;
//不是要自绘的控件,返回默认值
2、按钮(Button)控件
一开始很奇怪,在
WM_CTLCOLOR的消息处理函数进行如下操作竟然没有用:
if (
pWnd->GetDlgCtrlID() == IDB_TEST
) //按钮文字颜色
{
pDC->SetTextColor(RGB(0, 0, 255));
}