【发布时间】: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。
标签: c visual-studio bitmap mfc