VC++中频繁读取位图,频繁重绘发生意外结果怎么回事?

重绘命令是这个:InvalidateRect(hWnd,NULL,1)位图读取是用这个代码:hbmp=(HBITMAP)LoadImage(NULL,L"..\\snc.... 重绘命令是这个: InvalidateRect(hWnd,NULL,1)
位图读取是用这个代码:hbmp =(HBITMAP)LoadImage(NULL,L"..\\snc.bmp",IMAGE_BITMAP,700,450,LR_LOADFROMFILE);
SelectObject(mdc,hbmp);
BitBlt(hdc,162,30,700,450,mdc,0,0,SRCCOPY);

图像什么都可以正常显示,但是频繁重绘后,到大概上百次以后就发生位图无法读入的问题。ReleaseDC也用过,并不好使,求好心人解释,而且好像是大图才有的问题。
展开
 我来答
swordlea
2012-07-16 · TA获得超过460个赞
知道答主
回答量:26
采纳率:0%
帮助的人:17.5万
展开全部
位图无法读入是由于GDI句柄资源耗尽导致的。当使用完资源后,必须通过调用函数以释放被占用的句柄资源,对于位图资源,需要使用DeleteObject函数释放。这是因为,在调用LoadImage这类API时,系统会在堆中分配GDI资源,直到用户调用了对应的函数,或者程序正常退出时,这些句柄资源才会被释放。而这些句柄资源在系统中是有限的,当对其申请达到上限时,程序就会发生异常,甚至还会导致系统异常(比如无法启动新的应用程序,程序窗体文字无法正常显示等)。以前我在写程序的过程中,也遇到这样的问题,当时连任务管理器无法启动(因为新程序启动时也会申请GDI句柄资源)。后来使用BoundsChecker之类的工具,才检测到是某个逻辑分支没有调用对应的释放函数(正是DeleteObject函数),加上去就好了。

参考资料: http://baike.baidu.com/view/1080246.htm

Bk0X
2012-07-16 · TA获得超过9413个赞
知道小有建树答主
回答量:1217
采纳率:60%
帮助的人:663万
展开全部
是不是没有调用过DeleteObject来释放过位图呢.
不释放的话就等于内存泄露, 可能会有资源用尽的问题..

而且位图的话, 也不需要每次重绘都读取一次的.
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式