最近做一个项目,为了控制窗口颜色,使用了 OnCtlColor函数。
HBRUSH CMyDialog::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CBCGPFormView::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: 修改了事件和模式显示的字体和背景色
if(pWnd == GetDlgItem(IDC_STA_0)
|| pWnd == GetDlgItem(IDC_STA_1))
{
HBRUSH B = CreateSolidBrush(RGB(1,1,1));
return B;
}
// TODO: 如果默认的不是所需画笔,则返回另一个画笔
return hbr;
}
后来用任务管理器观察,发现GDI数据会一直增加,最终出现无法获取资源的错误。主界面无法正常显示。
折腾了两天,才发现是下面这两句导致的。
HBRUSH CMyDialog::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CBCGPFormView::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: 修改了事件和模式显示的字体和背景色
if(pWnd == GetDlgItem(IDC_STA_0)
|| pWnd == GetDlgItem(IDC_STA_1))
{
HBRUSH B = CreateSolidBrush(RGB(1,1,1));
return B;
}
// TODO: 如果默认的不是所需画笔,则返回另一个画笔
return hbr;
}
因为我是用Static控件显示时间的,每秒钟会刷新一次。
而CreateSolidBrush创建的GDI对象没有被释放,造成GDI溢出。
改为成员变量, HBRUSH m_hBrush;
在窗体初始化的时候
OnInitialDialog中添加
m_hBrush = CreateSolidBrush(RGB(1,1,1));
然后OnCtlColor直接返回之前创建好的句柄
HBRUSH CMyDialog::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CBCGPFormView::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: 修改了事件和模式显示的字体和背景色
if(pWnd == GetDlgItem(IDC_STA_0)
|| pWnd == GetDlgItem(IDC_STA_1))
{
// HBRUSH B = CreateSolidBrush(RGB(1,1,1)); return m_hBrush;
}
// TODO: 如果默认的不是所需画笔,则返回另一个画笔
return hbr;
}
// TODO: 如果默认的不是所需画笔,则返回另一个画笔
return hbr;
}
这样每次不会创建新的对象
记的在适当的位置调用 DeleteObject(m_hBrush);