1 前言
改变控件颜色文字字体等是通过消息WM_CTLCOLOR来改变的,对应的消息处理函数为
CWnd::OnCtlColor
afx_msg HBRUSH OnCtlColor(CDC *pDC, CWnd *pWnd, UINT nCtlColor);
这个函数会被调用多次,每次绘制的控件/窗口不同,对应的参数pDC 和 pWnd 也不同,nCtlColor表示控件的类型,如下
CTLCOLOR_BTN Button control
CTLCOLOR_DLG Dialog box
CTLCOLOR_EDIT Edit control
CTLCOLOR_LISTBOX List-box control
CTLCOLOR_MSGBOX Message box
CTLCOLOR_SCROLLBAR Scroll-bar control
CTLCOLOR_STATIC Static control
可以根据nCtlColor的类型决定绘制什么样的颜色字体等。 也可以通过一个函数CWnd::GetDlgCtrlID
int GetDlgCtrlID() const; 来取得本次是调用本次函数时控件的ID,然后再决定什么样的处理。
2 例子
eg.
HBRUSH CTestDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
CBrush brush;
brush.CreateSolidBrush(RGB(255, 0, 0)); //创建画刷
// TODO: Change any attributes of the DC here
if (pWnd->GetDlgCtrlID() == IDC_TEXT) //如果该控件的ID是IDC_TEXT
{
CFont font;
font.CreatePointFont(200, "黑体");
CFont *pOldFont = pDC->SelectObject(&font);
return brush; //用这个画刷绘制该控件的背景色
}
if (pWnd->GetDlgCtrlID() == IDC_EDIT1) //如果该控件的ID是IDC_EDIT1 , 即单行的编辑框
{
pDC->SetBkColor(RGB(255, 0, 0));
//pDC->SetBkMode(TRANSPARENT); //设置文字背景透明可能会产生难看的样式,所以按照MSDN调用了 // SetBkColor ,见NOTE
pDC->SetTextColor(RGB(0, 0, 255)); //文字颜色
return brush;
}
// TODO: Return a different brush if the default is not desired
return hbr;
}
NOTE:①SetBkMode() 是设置文字背景是否透明
②如果控件是单行的EDIT编辑框,那么可能会出现:即使改变了文字颜色和背景色并且设置文字背景透明,那么也有可能会在文字背景中有难看的矩形块,因此这种情况下就要调用SetBkColor()来改变文字背景色和该控件的背景色(返回的画刷颜色)一致即可。
?