调整窗口大小时位图消失

Posted

技术标签:

【中文标题】调整窗口大小时位图消失【英文标题】:Bitmap disappears when window is resized 【发布时间】:2015-04-16 19:23:19 【问题描述】:

我有一个简单的 GUI,当我在某个选项卡上时应该显示图像。我在选项卡进程中有 WM_PAINT 消息,如下所示

case WM_PAINT:
    
            PAINTSTRUCT psLOGO;
            RECT rcLOGO;
            HDC hdcLOGO;
            //Prepares for painting window
            hdcLOGO = BeginPaint(hwndMonitor, &psLOGO);
            //Retrieves the coordinates of the windows client area
            GetClientRect(hwndMonitor, &rcLOGO);
            //creates a copy of the memory device context 
            HDC hdcDoubleLOGO = CreateCompatibleDC(hdcLOGO);
            HBITMAP Logo = LoadBitmap(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_BITMAP1));         //Get a bitmap of the picture to be updated
            HBITMAP bmOldLOGO = (HBITMAP)SelectObject(hdcDoubleLOGO, Logo);                                 //Get a handle to the image being replaced
            BitBlt(hdcLOGO, 0, 0, rcLOGO.right, rcLOGO.bottom, hdcDoubleLOGO, 0, 0, SRCCOPY);   //Bit block transfer of the bitmap color data

            SelectObject(hdcDoubleLOGO, bmOldLOGO);
            DeleteDC(hdcDoubleLOGO);
            EndPaint(hwndMonitor, &psLOGO);
            DeleteObject(Logo);
        break;
    

hwndMonitor 是特定标签页的句柄

图像在我打开选项卡时显示,但如果我调整窗口大小,或者如果我最小化并重新打开 GUI,图像将消失

我必须转到另一个选项卡并返回该选项卡才能恢复图像

我在 WM_PAINT 消息中做错了吗?

【问题讨论】:

您是否检查以确保所有调用都成功? 我做到了,我在 WM_PAINT 的开头添加了一个断点,并逐步通过消息代码。看起来所有变量都已正确初始化和使用。我确实注意到,当我重新打开 GUI 时,它只调用了一次 WM_PAINT……但是当我切换选项卡时,它调用了两次 WM_PAINT。消息应该发送两次吗? 有时会发生这种情况,因为父选项卡窗口和子窗口重叠。尝试将标志 WS_CLIPCHILDREN 添加到父选项卡控件。或者在标签页上尝试WS_CLIPSIBLINGS 【参考方案1】:

您还必须对 WM_SIZE 消息做出反应。调整窗口大小不会释放绘制消息。

在 WM_SIZE 上只需调用:

InvalidateRect(hwnd,&rect,TRUE);
UpdateWindow(hwnd);

rect 是具有当前窗口大小的矩形。 Invalidate 标记矩形进行重绘,UpdateWindow 确保它立即重绘。

【讨论】:

一般不需要调用UpdateWIndow,如果需要允许失效创建WM_PAINT会更高效。

以上是关于调整窗口大小时位图消失的主要内容,如果未能解决你的问题,请参考以下文章

调整大小时创建自定义窗口边框边缘消失

调整框架(窗口)大小后组件消失

在窗口调整大小时动态调整画布大小

使用 OpenGL 和 SDL 处理窗口大小调整

单击汉堡图标并调整窗口大小后,Navbar消失(我不希望它隐藏)

JFrame 菜单被绘制,图形在 JFrame 调整大小时消失