参考文章:白乔原创:VC之美化界面篇
在每个控件开始绘制之前,都会向其父窗口发送WM_CTLCOLOR通告消息,在该消息的处理函数中,可以设置控件显示文本的前景色、背景色以及字体。该消息处理函数还要求返回一个画刷的句柄,用于在控件具体的绘制之前擦除其客户区。
WM_CTLCOLOR映射消息处理函数为afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)。
常用代码为:
- pDC->SetTextColor(RGB(255, 0, 0)); //设置文本前景色
- pDC->SetBkColor(RGB(255, 255, 255)); //设置文本背景色
- pDC->SetBkMode(TRANSPARENT); //TRANSPARENT或OPAQUE
- pDC->SelectObject(...)
简单示例如下:
- //
- //m_font1与m_font2为CTestDlg的成员,类型为CFont
- //
- BOOL CTestDlg::OnInitDialog()
- {
- ......
- // TODO: Add extra initialization here
- m_font1.CreatePointFont(120, TEXT("Impact"));
- m_font2.CreatePointFont(120, TEXT("Arial"));
- ......
- }
- HBRUSH CTestDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
- {
- HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
- // TODO: Change any attributes of the DC here
- if (nCtlColor == CTLCOLOR_STATIC)
- {
- switch (pWnd->GetDlgCtrlID())
- {
- case IDC_STATIC_1:
- pDC->SetTextColor(RGB(255, 0, 0));
- pDC->SetBkColor(RGB(255, 255, 255));
- pDC->SetBkMode(TRANSPARENT);
- pDC->SelectObject(&m_font1);
- return (HBRUSH)::GetStockObject(BLACK_BRUSH);
- break;
- case IDC_STATIC_2:
- pDC->SetTextColor(RGB(255, 255, 0));
- pDC->SetBkColor(RGB(255, 255, 255));
- pDC->SelectObject(&m_font2);
- return (HBRUSH)::GetStockObject(BLACK_BRUSH);
- break;
- default:
- break;
- }
- }