我有以下代码......
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
是一个全局变量,它在代码中的某个位置分配....图像显示但只要我最小化窗口就会消失....
任何人都可以解释这个吗?
提前感谢,
答案 0 :(得分:4)
您的清理代码完全错误,您正在严重泄漏句柄。应该在TaskMgr.exe,Processes选项卡中很容易看到。查看+选择列并勾选GDI对象。当GDI对象句柄计数达到10,000时,此代码停止工作。是的,当您调整窗口大小时可能会发生这种情况,因为会有一连串的绘画请求。
不要删除BITMAP,它就像结构一样。在删除memDC之前,恢复从SelectObject()返回的旧位图句柄。不要使用ReleaseDC,需要DeleteDC。注意这些函数的返回值,它们告诉你什么时候搞砸了但是如果你从不检查断言那就不行。
使用这些明确的清理规则,GDI编程很痛苦。考虑一个类库来处理这种苦差事,他们从来没有弄错。
答案 1 :(得分:1)
我想某种程度上hBitmap会在最小化时变为null。 发布您分配和引用hBitmap的代码将有助于确定我认为的问题。