要给窗口设置图片并确保后面不被刷新掉,可以使用WM_PAINT消息和双缓冲技术。
下面是一个示例代码,展示如何通过句柄给窗口设置图片,并在窗口绘制时使用双缓冲来防止图片被刷新掉:
#include <windows.h>
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
int main()
{
// 创建窗口类注册
WNDCLASSEX wc = { 0 };
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WindowProc;
wc.hInstance = GetModuleHandle(NULL);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.lpszClassName = L"MyWindowClass";
RegisterClassEx(&wc);
// 创建窗口
HWND hwnd = CreateWindowEx(
0,
L"MyWindowClass",
L"窗口标题",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
NULL,
NULL,
GetModuleHandle(NULL),
NULL
);
if (hwnd == NULL)
return 0;
// 加载图片
HBITMAP hBitmap = static_cast<HBITMAP>(LoadImage(GetModuleHandle(NULL),
L"path_to_image_file.bmp",
IMAGE_BITMAP,
0, 0,
LR_LOADFROMFILE));
if (hBitmap == NULL)
return 0;
// 存储绘制区域的矩形
RECT clientRect;
GetClientRect(hwnd, &clientRect);
// 创建双缓冲绘制设备上下文
HDC hdc = GetDC(hwnd);
HDC memDC = CreateCompatibleDC(hdc);
HBITMAP hOldBitmap = SelectObject(memDC, hBitmap);
// 绘制图片到双缓冲区域
BitBlt(hdc, 0, 0, clientRect.right, clientRect.bottom,
memDC, 0, 0, SRCCOPY);
SelectObject(memDC, hOldBitmap);
DeleteObject(hBitmap);
DeleteDC(memDC);
ReleaseDC(hwnd, hdc);
// 显示窗口
ShowWindow(hwnd, SW_SHOWDEFAULT);
UpdateWindow(hwnd);
// 消息循环
MSG msg;
while (GetMessage(&msg, nullptr, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return static_cast<int>(msg.wParam);
}
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg,
WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd,&ps); // 开始绘制
// 在这里添加自定义的绘制逻辑,不要再绘制图片了
EndPaint(hwnd,&ps); // 结束绘制
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
return 0;
}
在上述代码中,我们使用LoadImage()函数加载一张图片(.bmp格式)作为窗口的背景图。然后,通过双缓冲绘制设备上下文(memDC)将图片绘制到内存中,并使用BitBlt()函数将内存中的内容复制到窗口的设备上下文(hdc)。这样可以确保在窗口刷新时,不会重新绘制图片。
请注意,你需要将 L"path_to_image_file.bmp" 替换为实际的图片文件路径。
最后,在消息循环中,处理 WM_PAINT 消息以添加自定义的绘制逻辑。在这个示例中,我们没有再次绘制图片,而是留出空白供你添加其他自定义绘制操作。
这种方式可以实现在窗口显示期间保持一张静态图片,并避免被刷新掉。
内容由零声教学AI助手提供,问题来源于学员提问




