GDI+ 图形::D rawImage 不起作用

GDI+ Graphics::DrawImage doesn't work

本文关键字:不起作用 rawImage GDI+ 图形      更新时间:2023-10-16

我正在尝试使用 GDI+ 绘制图像。当我在里面做WM_PAINT它工作时:

case WM_PAINT: {
    hdc = BeginPaint(hWnd, &ps);
    Gdiplus::Graphics graphics(hdc);
    Gdiplus::Image gdiImage(L"unt.png");
    graphics.DrawImage(&gdiImage, 40, 40);
    EndPaint(hWnd, &ps);
    break;
}

但是当我在按钮单击或WM_CREATE内执行此操作时,它不会绘制图像:

HDC hdc2 = GetDC(hWnd);
Gdiplus::Graphics graphics(hdc2);
Gdiplus::Image gdiImage(L"unt.png");
graphics.DrawImage(&gdiImage, 40, 40);

即使我使用BeginPaint()EndPaint()它仍然失败。那么,有没有办法在WM_PAINT之外绘制图像?

在 Win32 中,几乎所有绘制都必须在处理程序中进行WM_PAINT。可能您看不到任何绘图,因为一旦您完成处理按钮单击,您就会收到WM_PAINT。

如果在WM_PAINT外部绘制,则由于窗口失效,绘图的寿命很短,然后WM_PAINT消息。

因此,在 Win32 中绘制的正确方法是WM_PAINT处理程序。

我在作者评论后编辑了答案。假设您需要在鼠标单击后更改图像。你可以做:

case WM_PAINT: {
    hdc = BeginPaint(hWnd, &ps);
    Gdiplus::Graphics graphics(hdc);
    Gdiplus::Image gdiImage(clicked ? L"image_A.png" : L"image_B.png");
    graphics.DrawImage(&gdiImage, 40, 40);
    EndPaint(hWnd, &ps);
    break;
}
case WM_LBUTTONDOWN: {
    clicked = true;
    InvalidateRect(hwnd, NULL, true);
    break;
}

InvalidateRect函数就是答案。使用该功能,您可以告诉Windows重绘窗口。这是指向手册页的链接:InvalidateRect

如果需要基于按钮单击(或任何其他 Windows 事件处理程序)更新图像,则必须使图像在屏幕上占据的区域无效(通常通过InvalidateRect()),然后让WM_PAINT处理程序绘制图像。