如果你想以参数的形式传递背景图片给窗口处理函数,可以按照以下方式修改示例代码:
#include <Windows.h>
// 窗口过程函数
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
static HBITMAP hBitmap = nullptr;
switch (msg)
{
case WM_CREATE:
{
// 从参数中获取背景图片路径
LPCWSTR imagePath = reinterpret_cast<LPCWSTR>(lParam);
// 加载背景图片资源
hBitmap = (HBITMAP)LoadImage(NULL, imagePath, 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(hBitmap, sizeof(BITMAP), &bitmap);
SelectObject(memDC, hBitmap); // 将位图选入内存设备上下文
// 将位图绘制到窗口上
BitBlt(hdc, 0, 0, bitmap.bmWidth, bitmap.bmHeight,
memDC, 0, 0, SRCCOPY);
DeleteDC(memDC); // 删除内存设备上下文
EndPaint(hwnd, &ps);
}
break;
case WM_DESTROY:
DeleteObject(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)
{
// 获取命令行参数(图片路径)
LPCWSTR imagePath = reinterpret_cast<LPCWSTR>(lpCmdLine);
// 创建窗口类
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,
(LPVOID)imagePath // 将图片路径作为窗口创建时的额外参数传递给窗口过程函数
);
ShowWindow(hwnd, nCmdShow);
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int)msg.wParam;
}
在这个修改后的代码中,我们使用 WinMain 函数获取了命令行参数(图片路径),然后将它作为额外参数传递给窗口过程函数 WndProc。
通过这种方式,你可以在调用 CreateWindow 时传递背景图片路径作为额外参数,然后在窗口过程函数中将其用于加载背景图片资源。
希望这个修改后的代码对你有所帮助!
内容由零声教学AI助手提供,问题来源于学员提问




