概述
某次编写了一个MFC程序,该程序每运行一段时间后,都会出现操作界面无反应的现象,更有甚者,拖动界面后还会导致界面崩溃。然而,调试代码时我发现:后台仍然在正常工作着。
没错!我遇到的就是MFC界面假死问题!
那么究竟是什么原因导致了界面假死呢?
在我的情景下,程序每次进入OnCtlColor()函数后,我都会使用CreateSolidBrush(RGB(0,0,0))来创建一个黑色画刷,将edit ctrl的背景刷成黑色。然而使用完这个画刷后我并没有使用DeleteObject()及时释放,导致画刷数目随着程序运行不断增加。
当GDI资源(画刷是GDI资源中的一种,其余的还有画笔、位图、字体等)超过10000,界面便会陷入假死!
此处插播一下:小伙伴们会好奇,你是怎么监视某个进程占用的GDI资源数目的呢?
推荐工具:GDIView。
有需要的请点击链接下载:https://download.csdn.net/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来释放。
最后
以上就是风趣摩托为你收集整理的通过及时释放GDI资源避免MFC界面假死的全部内容,希望文章能够帮你解决通过及时释放GDI资源避免MFC界面假死所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复