MFC中“所需资源不可用”

您所在的位置:网站首页 origin提示所需资源不可用 MFC中“所需资源不可用”

MFC中“所需资源不可用”

2024-04-24 02:35| 来源: 网络整理| 查看: 265

参考:MFC异常“所需资源不可用”            vc中DC资源的正确利用            VC资源分配、释放表            mfc程序长时间运行后报错:a required resource was unavailable、

现象:软件在运行很长一段时间后,弹出“所需资源不可用”,也或者是菜单栏、Ribbon变白、软件界面不再响应鼠标消息,但在任务管理器中发现软件不占用CPU,也没有“无响应”标识,呈现类似死锁状态。

可能原因:GDI相关资源耗尽

说明:什么是GDI?         GDI:graphics device interface 图形设备接口         GDI好比画图时用的所有工具

处理方法:         查找OnTimer()、OnPaint()、OnEraseBkgnd()、OnCtlColor()这些方法中资源分配后是否释放。

1、DC资源【 什么是DC?CDC?HDC?】

资源分配函数清除函数需要手动清除DCCreateDCDeleteDCYesCreateCompatibleDCDeleteDCYesGetDCReleaseDCYesGetWindowDCReleaseDCYesBeginPaintEndPaintYes

举例:在OnTimer()中连续执行如下语句:

HDC hDC = GetDC()->m_hDC; m_table.Refresh(hDC);

这样会造成dc资源的耗尽,原因是GetDC() 返回CDC*,要把CDC*所指的资源及时删除,才能连续使用。修改如下:

CDC * pDC = GetDC(); HDC hDC = pDC->m_hDC; m_table.Refresh(hDC); pDC->DeleteDC();

2、Brushes资源【画刷】

资源分配函数作用清除函数需要手动清除BrushesCreateBrushIndirect通过LOGBRUSH结构体来取画刷DeleteObjectYesCreateDIBPatternBrush通过与设备无关位图创建一个画刷DeleteObjectYesCreateHatchBrush创建一种带阴影的画刷DeleteObjectYesCreatePatternBrush得到位图画刷DeleteObjectYesCreateSolidBrush单色的画刷DeleteObjectYes

例如:在OnCtlColor()中里返回的画刷的句柄,因为是局部变量而没有被释放

HBRUSH ConsoleTest::OnCtlColor(CDC* pDC,CWnd* pWnd,UINT nCtlColor) { COLORREF bkcolor(RGB(80, 112, 149)); LOGBRUSH logBrush; logBrush.lbHatch = 0; logBrush.lbStyle = BS_SOLID; logBrush.lbColor = bkcolor; HBRUSH m_hBrush = (HBRUSH)::CreateBrushIndirect(&logBrush); return m_hBrush; }

修改为成员变量: 在 ConsoleTest.h 中定义:

LOGBRUSH logBrush; HBRUSH m_hBrush;

在 ConsoleTest.app 中 初始化的函数:

COLORREF bkcolor(RGB(80, 112, 149)); logBrush.lbHatch = 0; logBrush.lbStyle = BS_SOLID; logBrush.lbColor = bkcolor; m_hBrush = (HBRUSH)::CreateBrushIndirect(&logBrush);

在 ConsoleTest.app 中 OnCtlColor():

HBRUSH ConsoleTest::OnCtlColor(CDC* pDC,CWnd* pWnd,UINT nCtlColor) { return m_hBrush; }



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3