MFC中改变DIALOG背景色和控件底色,一般采取重载OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)。
OnCtlColor是控件窗口函数,其画刷句柄效果提示信息函数( afx_msg HBRUSH OnCtlColor )构成:
返回值,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成员函数。
原始白色的对话框与背景色不一致,通过重载OnCtlColor改变空间背景色。
重载函数:
HBRUSH CDialog_***::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: 在此更改 DC 的任何属性
CBrush m_secbg;
m_secbg.DeleteObject();
m_secbg.m_hObject = NULL;
m_secbg.CreateSolidBrush(RGB(122,122,122));
switch(nCtlColor)
{
case CTLCOLOR_STATIC: //对所有静态文本控件的设置
{
pDC->SetTextColor(STATIC_COLOR); //设置字体颜色
//pDC->SetBkColor(RGB(0,0,0));
pDC->SetBkMode(TRANSPARENT); //设置背景为透明
break;
}
case CTLCOLOR_EDIT:
{
pDC->SetTextColor(RGB(0,0,0)); //设置字体颜色
//pDC->SetBkColor(RGB(0,0,0));
pDC->SetBkColor(RGB(255,255,255));
//pDC->SetBkMode(TRANSPARENT); //设置背景为透明
return hbr;
}
}
pDC->SetBkMode(TRANSPARENT); //设置背景为透明
// TODO: 如果默认的不是所需画笔,则返回另一个画笔
return m_secbg;
}
重载后的效果如下图