现在的位置: 首页 > 综合 > 正文

WM_CTLCOLOR消息

2013年10月27日 ⁄ 综合 ⁄ 共 1616字 ⁄ 字号 评论关闭

参考文章:白乔原创:VC之美化界面篇

        在每个控件开始绘制之前,都会向其父窗口发送WM_CTLCOLOR通告消息,在该消息的处理函数中,可以设置控件显示文本的前景色、背景色以及字体。该消息处理函数还要求返回一个画刷的句柄,用于在控件具体的绘制之前擦除其客户区。

        WM_CTLCOLOR映射消息处理函数为afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)。
    常用代码为:

  1. pDC->SetTextColor(RGB(255, 0, 0));    //设置文本前景色  
  2. pDC->SetBkColor(RGB(255, 255, 255));  //设置文本背景色  
  3. pDC->SetBkMode(TRANSPARENT);          //TRANSPARENT或OPAQUE  
  4. pDC->SelectObject(...)  

        简单示例如下:

  1. //  
  2. //m_font1与m_font2为CTestDlg的成员,类型为CFont  
  3. //  
  4. BOOL CTestDlg::OnInitDialog()  
  5. {  
  6.         ......  
  7.     // TODO: Add extra initialization here  
  8.         m_font1.CreatePointFont(120,  TEXT("Impact"));   
  9.         m_font2.CreatePointFont(120,  TEXT("Arial"));  
  10.         ......  
  11. }  
  12.   
  13. HBRUSH CTestDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)  
  14. {  
  15.     HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);  
  16.   
  17.     // TODO:  Change any attributes of the DC here  
  18.     if (nCtlColor == CTLCOLOR_STATIC)  
  19.     {  
  20.         switch (pWnd->GetDlgCtrlID())  
  21.         {  
  22.         case IDC_STATIC_1:  
  23.             pDC->SetTextColor(RGB(255, 0, 0));  
  24.             pDC->SetBkColor(RGB(255, 255, 255));  
  25.             pDC->SetBkMode(TRANSPARENT);  
  26.             pDC->SelectObject(&m_font1);  
  27.             return (HBRUSH)::GetStockObject(BLACK_BRUSH);  
  28.             break;  
  29.         case IDC_STATIC_2:  
  30.             pDC->SetTextColor(RGB(255, 255, 0));  
  31.             pDC->SetBkColor(RGB(255, 255, 255));  
  32.             pDC->SelectObject(&m_font2);  
  33.             return (HBRUSH)::GetStockObject(BLACK_BRUSH);  
  34.             break;  
  35.         default:  
  36.             break;  
  37.         }  
  38.     }  

抱歉!评论已关闭.