要通过句柄给窗口设置图片,并确保该图片不会被刷新掉,可以使用窗口的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;
// 显示窗口
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);
// 在绘制区域绘制图片
HBITMAP hBitmap = static_cast<HBITMAP>(LoadImage(NULL,
L"path_to_image_file.bmp",
IMAGE_BITMAP,
0, 0,
LR_LOADFROMFILE));
if (hBitmap != NULL)
{
HDC hdcMem = CreateCompatibleDC(hdc);
HGDIOBJ hOldBitmap = SelectObject(hdcMem, hBitmap);
// 获取图片的尺寸
BITMAP bm;
GetObject(hBitmap, sizeof(bm), &bm);
int width = bm.bmWidth;
int height = bm.bmHeight;
// 将图片绘制到窗口客户区
BitBlt(hdc, 0, 0, width, height, hdcMem, 0, 0, SRCCOPY);
// 清理资源
SelectObject(hdcMem, hOldBitmap);
DeleteDC(hdcMem);
}
EndPaint(hwnd, &ps);
break;
}
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
return 0;
}
在上述代码中,我们使用WM_PAINT
消息来处理窗口的绘制事件。当收到该消息时,我们在窗口的客户区域绘制一张指定路径的位图(.bmp)。
你需要将 L"path_to_image_file.bmp"
替换为实际的图片文件路径。
通过以上代码,在窗口创建后,图片将会被绘制到窗口的客户区域,并且不会被刷新掉。在窗口重绘时,WM_PAINT
消息会再次触发绘制操作,确保图像的持久显示。
内容由零声教学AI助手提供,问题来源于学员提问