我有以下代码...
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
是一个全局变量,在代码中的某个位置分配......图像会显示,但每当我最小化窗口时就会消失......
谁能解释一下吗?
提前致谢,
最佳答案
你的清理代码完全错误,你严重泄漏了句柄。应在 TaskMgr.exe 的“进程”选项卡中清晰可见。查看 + 选择列并勾选 GDI 对象。当 GDI 对象句柄计数达到 10,000 时,此代码将停止工作。是的,当您调整窗口大小时可能会发生这种情况,因为会有大量的绘制请求。
不要删除 BITMAP,它就像结构体一样。在删除 memDC 之前,恢复从 SelectObject() 返回的旧位图句柄。不要使用ReleaseDC,需要DeleteDC。请注意这些函数的返回值,它们会在您搞砸时告诉您,但如果您从不检查断言,那么它们就无法工作。
GDI 编程对于这些显式的清理规则来说是痛苦的。考虑一个类库来处理这种苦差事,他们永远不会出错。
关于c++ - 为什么图像会消失?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5910806/