如果已经有了图片的 HBITMAP 变量,当窗口需要重新绘制时,你可以在窗口过程函数中更新背景图片。以下是示例代码:
#include <Windows.h>
HBITMAP g_hBitmap = nullptr; // 全局变量用于保存背景图片的 HBITMAP 句柄
// 窗口过程函数
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg)
{
case WM_CREATE:
{
// 初始化背景图片 HBITMAP 对象
g_hBitmap = (HBITMAP)LoadImage(NULL, L"image.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
}
break;
case WM_ERASEBKGND:
return TRUE; // 告诉系统已经擦除了背景,无需再进行默认处理
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
HDC memDC = CreateCompatibleDC(hdc); // 创建与显示设备兼容的内存设备上下文
BITMAP bitmap;
GetObject(g_hBitmap, sizeof(BITMAP), &bitmap);
SelectObject(memDC, g_hBitmap); // 将位图选入内存设备上下文
// 将位图绘制到窗口上
BitBlt(hdc, 0, 0, bitmap.bmWidth, bitmap.bmHeight,
memDC, 0, 0, SRCCOPY);
DeleteDC(memDC); // 删除内存设备上下文
EndPaint(hwnd, &ps);
}
break;
case WM_DESTROY:
DeleteObject(g_hBitmap); // 删除位图对象
PostQuitMessage(0);
return 0;
default:
return DefWindowProc(hwnd, msg, wParam, lParam);
}
return 0;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
// 创建窗口类
WNDCLASS wc = { 0 };
wc.lpfnWndProc = WndProc; // 指定窗口过程函数
wc.hInstance = hInstance;
wc.lpszClassName = L"MyWindowClass";
RegisterClass(&wc);
// 创建窗口
HWND hwnd = CreateWindow(
L"MyWindowClass",
L"窗口标题",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
500,
500,
NULL,
NULL,
hInstance,
NULL
);
ShowWindow(hwnd, nCmdShow);
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
// 当窗口需要重新绘制时,更新背景图片
if (msg.message == WM_PAINT)
{
g_hBitmap = (HBITMAP)LoadImage(NULL, L"new_image.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
InvalidateRect(hwnd, NULL, TRUE); // 强制触发重绘消息,使新的图片生效
}
}
return (int)msg.wParam;
}
在这个示例代码中,我们在窗口过程函数的 WM_CREATE 消息中加载了背景图片,并将其保存在全局变量 g_hBitmap 中。当窗口收到 WM_PAINT 消息时,会使用 g_hBitmap 绘制背景。
如果需要重新设置图片,在窗口处理函数的相应位置更新 g_hBitmap 变量,并调用 InvalidateRect 函数强制触发重绘消息,使新的图片生效。
希望这个示例能满足你的需求!
内容由零声教学AI助手提供,问题来源于学员提问




