GDI + Graphics :: DrawImage不起作用

时间:2016-03-18 20:16:43

标签: c++ gdi+

我正在尝试使用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之外绘制图像?

2 个答案:

答案 0 :(得分:4)

在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

答案 1 :(得分:1)

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