为啥图像消失了?

Posted

技术标签:

【中文标题】为啥图像消失了?【英文标题】:Why the image disappears?为什么图像消失了? 【发布时间】:2011-05-06 11:32:51 【问题描述】:

我有以下代码...

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

谁能解释一下?

提前致谢,

【问题讨论】:

【参考方案1】:

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

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

GDI 编程对这些明确的清理规则很痛苦。考虑一个类库来处理这种苦差事,他们永远不会出错。

【讨论】:

谢谢哥们,我是WIN32的新手。到目前为止,我所学到的都是这些论坛的 bcoz,通过提问,无论人们建议我写什么...将按照您的建议改进我的代码.. 行动我对 WIN32 库不太熟悉...努力理解它的基本概念..我想我需要更加努力..Nyways感谢所有建议。 以下链接的最后一行说我们应该使用 DeleteObject() 来删除 BITMAP ....msdn.microsoft.com/en-us/library/dd183488(VS.85).aspx... 你的 cmets 需要... 是的,您使用 DeleteObject 删除了 HBITMAP。注意 H. 明白了....谢谢哥们....我做了一些更改,代码终于可以工作了.....【参考方案2】:

我猜想在最小化时 hBitmap 会以某种方式变为 null。 在您分配和引用 hBitmap 的位置发布代码将有助于确定我认为的问题。

【讨论】:

代码终于可以工作了... InvalidateRect() 被意外调用了。 . . .谢谢你的时间..

以上是关于为啥图像消失了?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的图像背景在浮动:左上消失?

为啥滚动时列表视图项目内的图像视图会消失?

为啥我的背景图像有时会消失?

为啥一组 android Image 消失了?

为啥点击 UICollectionViewCell 上的文本会消失?

为啥更新 iOS 7 后应用程序图标消失。 [重复]