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

时间:2024-06-04 14:02:50

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               
按钮控件   //(注意check
box 属于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)
          
{
        HBRUSH
hbr = 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
        return
hbr;
          
}

如果要指定某个特定控件可以这样写: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 not
desired

  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)

{

// 设置控件背景色与背景图片颜色一致

COLORREF
bkColor = RGB(239,239,239); //背景图片的颜色值

pDC->SetBkColor(bkColor);

return
(HBRUSH)::GetStockObject(NULL_BRUSH);

}