通过及时释放GDI资源避免MFC界面假死

某次编写了一个MFC程序,该程序每运行一段时间后,都会出现操作界面无反应的现象,更有甚者,拖动界面后还会导致界面崩溃。然而,调试代码时我发现:后台仍然在正常工作着。

没错!我遇到的就是MFC界面假死问题!


那么究竟是什么原因导致了界面假死呢?

在我的情景下,程序每次进入OnCtlColor()函数后,我都会使用CreateSolidBrush(RGB(0,0,0))来创建一个黑色画刷,将edit ctrl的背景刷成黑色。然而使用完这个画刷后我并没有使用DeleteObject()及时释放,导致画刷数目随着程序运行不断增加。

当GDI资源(画刷是GDI资源中的一种,其余的还有画笔、位图、字体等)超过10000,界面便会陷入假死!


此处插播一下:小伙伴们会好奇,你是怎么监视某个进程占用的GDI资源数目的呢?

推荐工具:GDIView

有需要的请点击链接下载:https://download.youkuaiyun.com/download/qq_36570733/16775161

使用起来很简单,这里就不再赘述了。


最后,谈谈如何释放GDI资源。

1、 检查GetWindowDC(), 后面是否有ReleaseDC();

2、 检查GetDC()后面是否有ReleaseDC();

3、 检查画刷CBrush:

CreateSolidBrush()后是否有 DeleteObject();

4、 检查画笔CPen:

CreatePen()后是否有DeleteObject();

5、 检查字体CFont:

CreateFont后是否有DeleteObject();

CreatePointFont()后是否有DeleteObject();

CFont *pOldFont =pDC->SelectObject(&m_font)后是否有pDC->SelectObject(pOldFont);

6、检查位图CBitmap:

CBitmap bmp;
bmp.CreateCompatibleBitmap(&dc, rcClient.Width(), rcClient.Height())后是否有bmp.DeleteObject();

7、检查绘图区域CRgn

CreateRoundRectRgn()后是否有DeleteObject();

总结一下就是:Create出来的GDI对象,都要用DeleteObject来释放;Create出来的DC,都要用DeleteDC来释放,GetDC得出的DC,要用ReleaseDC来释放。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值