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

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


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值