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也用过,并不好使,求好心人解释,而且好像是大图才有的问题。 展开
位图读取是用这个代码: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也用过,并不好使,求好心人解释,而且好像是大图才有的问题。 展开
2个回答
展开全部
位图无法读入是由于GDI句柄资源耗尽导致的。当使用完资源后,必须通过调用函数以释放被占用的句柄资源,对于位图资源,需要使用DeleteObject函数释放。这是因为,在调用LoadImage这类API时,系统会在堆中分配GDI资源,直到用户调用了对应的函数,或者程序正常退出时,这些句柄资源才会被释放。而这些句柄资源在系统中是有限的,当对其申请达到上限时,程序就会发生异常,甚至还会导致系统异常(比如无法启动新的应用程序,程序窗体文字无法正常显示等)。以前我在写程序的过程中,也遇到这样的问题,当时连任务管理器无法启动(因为新程序启动时也会申请GDI句柄资源)。后来使用BoundsChecker之类的工具,才检测到是某个逻辑分支没有调用对应的释放函数(正是DeleteObject函数),加上去就好了。
参考资料: http://baike.baidu.com/view/1080246.htm
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询