为啥图像消失了?
Posted
技术标签:
【中文标题】为啥图像消失了?【英文标题】:Why the image disappears?为什么图像消失了? 【发布时间】:2011-05-06 11:32:51 【问题描述】:我有以下代码...
case WM_PAINT:
hdc = BeginPaint(hwnd,&paintSt);
temphdc = hdc;
GetClientRect(hwnd,&aRect);
if(hBitmap!=NULL)
HDC memDC = CreateCompatibleDC(hdc);
if(memDC!=NULL)
BITMAP bmp;
GetObject(hBitmap,sizeof(bmp),&bmp);
SelectObject(memDC,hBitmap);
SetStretchBltMode(hdc,HALFTONE);
StretchBlt(hdc,0,0,aRect.right,aRect.bottom,
memDC,0,0,bmp.bmWidth,bmp.bmHeight,
SRCCOPY);
DeleteObject(&bmp);
ReleaseDC(hwnd,memDC);
// the code for painting
EndPaint(hwnd,&paintSt);
break;
hBitmap
是一个全局变量,在代码中的某个位置分配....图像会显示,但只要我最小化窗口就会消失....
谁能解释一下?
提前致谢,
【问题讨论】:
【参考方案1】:您的清理代码全错了,您严重泄漏句柄。应该在 TaskMgr.exe 的“进程”选项卡中很容易看到。查看 + 选择列并勾选 GDI 对象。当 GDI 对象句柄计数达到 10,000 时,此代码将停止工作。是的,当您调整窗口大小时可能会发生这种情况,因为会有大量的绘制请求。
不要删除 BITMAP,它和 struct 一样。在删除 memDC 之前恢复从 SelectObject() 返回的旧位图句柄。不要使用 ReleaseDC,DeleteDC 是必需的。注意这些函数的返回值,当你搞砸了,它们会告诉你,但如果你从不检查断言,那就行不通了。
GDI 编程对这些明确的清理规则很痛苦。考虑一个类库来处理这种苦差事,他们永远不会出错。
【讨论】:
谢谢哥们,我是WIN32的新手。到目前为止,我所学到的都是这些论坛的 bcoz,通过提问,无论人们建议我写什么...将按照您的建议改进我的代码.. 行动我对 WIN32 库不太熟悉...努力理解它的基本概念..我想我需要更加努力..Nyways感谢所有建议。 以下链接的最后一行说我们应该使用 DeleteObject() 来删除 BITMAP ....msdn.microsoft.com/en-us/library/dd183488(VS.85).aspx... 你的 cmets 需要... 是的,您使用 DeleteObject 删除了 HBITMAP。注意 H. 明白了....谢谢哥们....我做了一些更改,代码终于可以工作了.....【参考方案2】:我猜想在最小化时 hBitmap 会以某种方式变为 null。 在您分配和引用 hBitmap 的位置发布代码将有助于确定我认为的问题。
【讨论】:
代码终于可以工作了... InvalidateRect() 被意外调用了。 . . .谢谢你的时间..以上是关于为啥图像消失了?的主要内容,如果未能解决你的问题,请参考以下文章