我正在尝试使用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
之外绘制图像?
答案 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
处理程序绘制图像。