读书人

怎么设置Cstatic及其子控件背景色

发布时间: 2012-09-28 00:03:35 作者: rapoo

如何设置Cstatic及其子控件背景色
我在对话框上建立了一个Cstatic0,然后再cstatic上又放了两个Cstatic,分别极为1和2,这两个是子控件,我希望这三个Cstatic的背景色都为白色,我在对话框上添加响应消息OnCtlColor,在里面作如下判断,但是只有Cstatic0背景色变,
if (nCtlColor == CTLCOLOR_STATIC )
{
pDC->SetBkMode(TRANSPARENT);
// Return handle to our CBrush object
pDC->SetTextColor(RGB(0, 0, 255));
hbr=(HBRUSH)::GetStockObject(DKGRAY_BRUSH);
}
关系为:
Cstatic0为对话框的子控件,Cstatic1,2为Cstatic0的子控件,我现在不想派生新类,该如何解决呢,使三个背景色都变。

[解决办法]
if(nCtlColor == CTLCOLOR_STATIC )
{
pDC->SetTextColor(RGB(0,0,255));
pDC->SetBkColor(RGB(255,255,255));
HBRUSH b=CreateSolidBrush(RGB(255,255,255));
return b;
}

[解决办法]
把你的判断条件修改一下:
WM_CTLCOLOR 消息响应函数中应该还有一个参数可用就是 窗口句柄 。
OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)

{
if(pWnd->GetDlgCtrlID()==IDC_RADIO_RECT)
{
pDC->SetTextColor(RGB(0,0,255));
pDC->SetBkColor(RGB(255,255,255));
return (HBRUSH)m_brushBk.GetSafeHandle();
}
}
把刷子声明为成员变量,这样会防止泄漏GDI对象句柄。你可以检测你进程的GDI 引用句柄数量
来求证,(window 资源管理器就可以看)析构函数中释放刷子句柄
[解决办法]
if(pWnd->GetDlgCtrlID()==IDC_RADIO_RECT ||
。。。。。。。)
{
pDC->SetTextColor(RGB(0,0,255));
pDC->SetBkColor(RGB(255,255,255));
HBRUSH b=CreateSolidBrush(RGB(255,255,255));//这里会泄漏GDI资源,建议使用成员变量,析构函数中释放刷子句柄。
return b;
}



[解决办法]
Static0 要派生自CStatic
在派生类中:
if (nCtlColor == CTLCOLOR_STATIC )
这是对子Static而言。

读书人网 >VC/MFC

热点推荐