为什么图像消失了?

时间:2011-05-06 11:32:51

标签: 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是一个全局变量,它在代码中的某个位置分配....图像显示但只要我最小化窗口就会消失....

任何人都可以解释这个吗?

提前感谢,

2 个答案:

答案 0 :(得分:4)

您的清理代码完全错误,您正在严重泄漏句柄。应该在TaskMgr.exe,Processes选项卡中很容易看到。查看+选择列并勾选GDI对象。当GDI对象句柄计数达到10,000时,此代码停止工作。是的,当您调整窗口大小时可能会发生这种情况,因为会有一连串的绘画请求。

不要删除BITMAP,它就像结构一样。在删除memDC之前,恢复从SelectObject()返回的旧位图句柄。不要使用ReleaseDC,需要DeleteDC。注意这些函数的返回值,它们告诉你什么时候搞砸了但是如果你从不检查断言那就不行。

使用这些明确的清理规则,GDI编程很痛苦。考虑一个类库来处理这种苦差事,他们从来没有弄错。

答案 1 :(得分:1)

我想某种程度上hBitmap会在最小化时变为null。 发布您分配和引用hBitmap的代码将有助于确定我认为的问题。