C++ 为什么图像会消失?
我有以下代码C++ 为什么图像会消失?,c++,winapi,visual-c++,C++,Winapi,Visual C++,我有以下代码 case WM_PAINT: { hdc = BeginPaint(hwnd,&paintSt); temphdc = hdc; GetClientRect(hwnd,&aRect); if(hBitmap!=NULL) { HDC memDC = CreateCompatibleDC(hdc);
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
是一个全局变量,分配在代码中的某个位置。。。。图像显示,但在最小化窗口时消失
有人能解释一下吗
提前感谢,我猜hBitmap在最小化时不知何故正在更改为null。
在分配和引用hBitmap的位置发布代码将有助于识别问题。您的清理代码完全错误,您严重泄漏了句柄。应在TaskMgr.exe的“进程”选项卡中随时可见。查看+选择列并勾选GDI对象。当GDI对象句柄计数达到10000时,此代码停止工作。是的,当您调整窗口大小时,可能会发生这种情况,因为会有一连串的绘制请求 不要删除位图,它与struct一样。在删除memDC之前,还原从SelectObject()返回的旧位图句柄。不要使用ReleaseDC,DeleteDC是必需的。请注意这些函数的返回值,它们会在您出错时告诉您,但如果您从未使用断言进行检查,这些函数将无法工作
使用这些显式清理规则进行GDI编程很痛苦。考虑一个类库来处理这种苦役,他们永远不会出错。 谢谢,伙计,我是WIN32的新手。到目前为止,我所学到的就是这些论坛的所有内容,通过提问,无论人们建议我写什么。。。将按照您的建议改进我的代码。。我对WIN32库不太熟悉。。。努力理解it的基本概念。。我想我需要更加努力工作。。。。Nyways感谢所有建议。下面链接的最后一行说我们应该使用DeleteObject()删除位图。。。。。。。需要您的评论…是的,您使用DeleteObject删除HBITMAP。注意,H,明白了。。。。谢谢你,伙计。。。。我做了一些修改,代码终于可以工作了…代码终于可以工作了。。。意外调用了InvalidateStuble()。谢谢你抽出时间。。