首页 > 代码库 > VC OnCtlColor函数来修改控件背景颜色

VC OnCtlColor函数来修改控件背景颜色

CWnd::OnCtlColor   afx_msg HBRUSH OnCtlColor( CDC* pDC, CWnd* pWnd, UINT nCtlColor );   返回值:OnCtlColor必须返回一个刷子句柄,该刷子将被用于画出控件的背景。   参数:

pDC 包含了子窗口的显示设备环境的指针。可能是临时的。 PWnd 包含了要求颜色的控件的指针。可能是临时的。 NCtlColor 包含了下列值,指定了控件的类型: · CTLCOLOR_BTN 按钮控件 · CTLCOLOR_DLG 对话框 · CTLCOLOR_EDIT 编辑控件 · CTLCOLOR_LISTBOX 列表框控件 · CTLCOLOR_MSGBOX 消息框 · CTLCOLOR_SCROLLBAR 滚动条控件 · CTLCOLOR_STATIC 静态控件

 说明:   当要画出一个子控件时,框架就调用这个成员函数。多数控件将这个消息发送到它们的父窗口(通常是一个对话框),为使用正确的颜色画出控件而准备pDC。   要改变文本的颜色,使用要求的红、绿、蓝色值(RGB)调用SetTextColor成员函数。   要改变单行编辑控件的背景颜色,在CTLCOLOR_EDIT和CTLCOLOR_MSGBOX消息代码中设置刷子句柄,并在响应CTLCOLOR_EDIT的代码中调用CDC::SetBkColor函数。   不会为下拉组合框中的列表框调用OnCtlColor函数,因为下拉列表框实际上是组合框的子窗口,而不是窗口的子窗口。要改变下拉列表框的颜色,创建一个CcomboBox,在重载的OnCtlColor中的nCtlColor参数中检查CTLCOLOR_LISTBOX。在这个处理函数中,为设置文本的背景必须使用SetBkColor成员函数。   注意:   框架调用这个成员函数以允许你的应用程序处理一个Windows消息。传递给你的成员函数的参数反映了接收到消息时框架接收到的参数。如果你调用了这个函数的基类实现,则该实现将使用最初传递给消息的参数(而不是你提供给这个函数的参数)。

 

 

afx_msg HBRUSH OnCtlColor(CDC *pDC,CWnd *pWnd,UINT nCtlColor);
          参数nCtlColor用于指定控件的类型,可以是:
          .CTLCOLOR_BTN               按钮控件   //(注意checkbox 属于button控件)
          .CTLCOLOR_DLG               对话框
          .CTLCOLOR_EDIT              编辑框
          .CTLCOLOR_LISTBOX           列表控件
          .CTLCOLOR_MSGBOX            消息控件
          .CTLCOLOR_SCROLLBAR 滚动条控件
          .CTLCOLOR_STATIC            静态控件
[程序实现]
          假设你已有了名为My的对话框工程.你有了一个STATIC的控件,ID为IDC_STATIC1.
  
HBRUSH CMyDlg::OnCtlColor(CDC* pDC, CWnd* pWnd,UINT nCtlColor)
          {
        HBRUSHhbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
  
       // TODO: Change any attributes of the DC here
           if(nCtlColor==CTLCOLOR_STATIC)

             {
                   pDC->SetTextColor(RGB(255,0,0));
  
//字体颜色
                   pDC->SetBkColor(RGB(0, 0,255));   //字体背景色  

               }
       
//TODO: Return a different brush if the default is not desired
        returnhbr;
          }


如果要指定某个特定控件可以这样写:ID为IDC_STATIC1

if (pWnd->GetDlgCtrlID()==IDC_STATIC1)
{
      pDC->SetTextColor(
RGB(255,0,0));  //设置字体颜色
      pDC->SetBkMode(TRANSPARENT);//设置字体背景为透明
// TODO:Return a different brush if the default is notdesired
  return(HBRUSH)::GetStockObject(BLACK_BRUSH);  // 设置背景色
}
else
return hbr;

 

3.改变背景颜色和文本颜色和字体:在OnCtlColor()添加代码:

if(pWnd->GetDlgCtrlID()==IDC_LINE_STYLE)

{

pDC->SetTextColor(RGB(255,0,0));

pDC->SetBkMode(TRANSPARENT);//设置文本背景色为透明

pDC->SelectObject(&m_font);//设置字体

return m_brush;//设置控件背景颜色

}

//对于按钮来说上面的方法无效

3. 设置控件ID为IDC_SYSFONTSAMPLE的背景颜色与其背景图片一致方法如下:

   if(pWnd->GetDlgCtrlID()==IDC_SYSFONTSAMPLE)
{

   // 设置控件背景色与背景图片颜色一致
     COLORREFbkColor = RGB(239,239,239); //背景图片的颜色值

    pDC->SetBkColor(bkColor);
    return(HBRUSH)::GetStockObject(NULL_BRUSH); 

}

VC OnCtlColor函数来修改控件背景颜色