c++ - 为什么图像会消失?

标签 c++ winapi visual-c++

我有以下代码...

    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/

相关文章:

visual-c++ - 为什么 MSVC 使用 SSE2 指令处理这种琐碎的事情?

c# - C# byte[] 的 C++ 模拟是什么?

c++ - 如何使用Chrono vs ctime库输入设置的开始时间和结束时间

c++ - 使用 qt 在 vector 中查找重复项

c++ - 在 C++ 中使用函数操作多维数组

c++ - ContiguousIterator 有实际用途吗?

winapi - 如何在 C++ WINAPI 中在窗口内绘制图标?

c++ - 为什么 shared_ptr<> 必须分别为控制 block 和管理对象分配?

c++ - 如何使用具有可警报 true 和总体最短 sleep 时间的 SleepEx?

winapi - 是否可以创建一个不会停用父窗口的子窗口?