关于Invalidate的问题

frequent 2014-02-14 10:30:15
我的一个程序,需要在每0.1秒内调用Invalidate刷新屏幕。前面一直都没问题。但到16分钟多后,就出现异常了,界面不刷新了。就边点击菜单都会先出来一块黑块,过几秒钟才出来,窗口上的其它控件也不刷新。
在VC2010下调试运行时,在出错的时候,输出窗口中显示有如下错误。
0x74e7812f 处最可能的异常: Microsoft C++ 异常: 内存位置 CResourceException

OnPaint中代码如下

CPaintDC dcMic(GetDlgItem(IDC_PIC_MIC));
CBitmap bmp;
bmp.LoadBitmap(IDB_BITMAP1);
//得到图片信息
BITMAP bmpInfo;
bmp.GetBitmap(&bmpInfo);
//在内存中创建一个位图兼容设备
CDC dcMemory1,dcMemory2;
dcMemory1.CreateCompatibleDC(&dcMic);
//将图片选入兼容设备
CBitmap *pOldBmp=dcMemory1.SelectObject(&bmp);
//将兼容设备的内容copy到屏幕设备中,实现真正的Paint
dcMic.BitBlt(0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight, &dcMemory1, 0, 0, SRCCOPY);
dcMemory1.SelectObject(pOldBmp);
dcMic.FillSolidRect(0,0,(int)(280*g_fInPic),18,RGB(51,0,51));

显示问题出在bmp.GetBitmap。
软件断在afxwin1.inl中GetBitmap下的ASSERT(m_hObject != NULL),我怀疑可能是bmp.LoadBitmap(IDB_BITMAP1)没有成功。


...全文
133 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
ZYBB 2014-02-15
  • 打赏
  • 举报
回复
没看懂楼主代码的具体意思,但是OnPaint函数不是每次调用完,里面的局部变量就释放了吗, 怎么还会有很多个Bitmap
encoderlee 版主 2014-02-15
  • 打赏
  • 举报
回复
出现问题的时候,在任务管理器里看看你的进程内存占用情况,还有GDI对象数量有多少,是不是达到上限了。 另外 CBitmap bmp; bmp.LoadBitmap(IDB_BITMAP1); //得到图片信息 BITMAP bmpInfo; bmp.GetBitmap(&bmpInfo); 这些每次OnPaint都要用到的对象,最好弄成成员变量,一次初始化多次使用
hhhh63 2014-02-15
  • 打赏
  • 举报
回复
可能是有些资源没有释放,把内存用光了。
schlafenhamster 2014-02-15
  • 打赏
  • 举报
回复
CBitmap bmp; bmp.LoadBitmap(IDB_BITMAP1); // .h CBitmap m_bmp; // 构造函数: m_bmp.LoadBitmap(IDB_BITMAP1);

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧