您的位置:首页 > 产品设计 > UI/UE

MFC GDI资源泄漏ERROR:a required resource was unavailable

2012-04-25 13:31 525 查看
mfc程序长时间运行后报错:a required resource was unavailable
原因是设置背景色时用到了GDI资源,程序刚开始运行的时候没问题,但随着时间的蔓延,GDI资源耗尽,则报错:a required resource was unavailable。
GDI资源使用数量可在任务管理器中查看。
也就是说GDI资源泄漏的问题。

接着找到用到GDI资源的地方,主要代码如下(在OnPaint()中):

if(nCtlColor == CTLCOLOR_STATIC) //针对所有的标签

{

//pDC->SetBkMode(TRANSPARENT);

pDC->SetBkColor(RGB(78,78,78));

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

//return (HBRUSH)::GetStockObject(NULL_BRUSH);

//return (HBRUSH)::GetStockObject(DKGRAY_BRUSH);

HBRUSH myhbr= CreateSolidBrush(RGB(85,85,85));

return myhbr;

}

将任务管理器中GDI对象打开,专门查看程序的GDI资源利用情况,发现只要程序一产生一个重绘事件(比如我拖动,拖动任务管理器窗口,放大缩小程序窗口),GDI资源就会增多。这种现象表示问题十有八九在OnPaint()函数中,但是我将程序用到的所有OnPaint()函数都查看过了,没什么可疑的,再次排查时,突然想到OnCtrlColor函数也会在界面刷新时调用,一查看果然发现问题,OnCtrlColor里返回的画刷的句柄因为是局部变量而没有被释放,改为成员变量,作如下修改后,解决问题

if(nCtlColor == CTLCOLOR_STATIC) //针对所有的标签

{

//pDC->SetBkMode(TRANSPARENT);

pDC->SetBkColor(RGB(78,78,78));

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

//return (HBRUSH)::GetStockObject(NULL_BRUSH);

//return (HBRUSH)::GetStockObject(DKGRAY_BRUSH);

//HBRUSH myhbr= CreateSolidBrush(RGB(85,85,85));

//return myhbr;

m_brBrush.DeleteObject();

m_brBrush.CreateSolidBrush(RGB(85,85,85));

return static_cast <HBRUSH> (m_brBrush.GetSafeHandle());

}

即可。

参考:http://blog.csdn.net/xyl_nuaa/article/details/6827365
http://hi.baidu.com/qi_xian/blog/item/08011716e096751e962b4345.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: