我试图使用MFC创建Windows窗口和其中的图形,但是在最小化或最大化窗口后,图形消失了。有没有一种方法可以使图形在最小化或最大化后仍然可以显示?
这是我写的代码。
#include"Header.h"
#include <iostream>
using namespace std;
int APIENTRY WinMain(HINSTANCE hinstance, HINSTANCE,
LPSTR lpstr, int ncmdshow)
{
WNDCLASSEX wnd;
wnd.cbClsExtra = 0;
wnd.cbWndExtra = 0;
wnd.cbSize = sizeof(WNDCLASSEX);
wnd.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wnd.hCursor = LoadCursor(NULL, IDC_ARROW);
wnd.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wnd.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
wnd.hInstance = hinstance;
wnd.lpfnWndProc = Mywndproc;
wnd.lpszClassName = TEXT("mywn");
wnd.lpszMenuName = NULL;
wnd.style = CS_HREDRAW | CS_VREDRAW;
RegisterClassEx(&wnd);
HWND hwnd = CreateWindow(TEXT("mywn"),
TEXT("mywn2"),
WS_OVERLAPPEDWINDOW,
50, 50, 300, 500,
NULL,
NULL,
hinstance,
0);
ShowWindow(hwnd, SW_SHOWNORMAL);
UpdateWindow(hwnd);
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
LALL回调Mywndproc(HWND hwnd,UINT消息,WPARAM wparam,LPARAM lparam) {
HDC hdc;
int x = LOWORD(lparam);
int y = HIWORD(lparam);
int cmd = LOWORD(wparam);
HBRUSH hbrush = CreateSolidBrush(RGB(125, 60, 250));
HBRUSH hbrush1 = CreateSolidBrush(RGB(255, 0, 0));
HPEN hpen = CreatePen(PS_DASH, 30, RGB(0, 50, 256));
PAINTSTRUCT ps;
switch (imessage)
{
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_LBUTTONDOWN:
hdc = GetDC(hwnd);
TextOut(hdc, x, y, TEXT("Name"), strlen("Name"));
DeleteDC(hdc);
break;
case WM_MOUSEMOVE:
hdc = GetDC(hwnd);
if (cmd == MK_LBUTTON) {
SelectObject(hdc, hbrush1);
Ellipse(hdc, x, y, x + 100, y + 120);
}
else if (cmd == MK_RBUTTON) {
TextOut(hdc, x, y, TEXT("Erevan"), strlen("Erevan"));
}
DeleteDC(hdc);
break;
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
TextOut(hdc, 100, 100, TEXT("Text"), strlen("Text"));
EndPaint(hwnd, &ps);
break;
case WM_RBUTTONDOWN:
hdc = GetDC(hwnd);
SelectObject(hdc, hbrush1);
Ellipse(hdc, x, y, x + 100, y + 120);
EndPaint(hwnd, &ps);
DeleteDC(hdc);
break;
default:
return DefWindowProc(hwnd, imessage, wparam, lparam);
}
return 0;
}
答案 0 :(得分:1)
在WM_PAINT
消息的处理之外画图绝对是可以的:
您应该致电ReleaseDC()
而不是DeleteDC()
来返回通过致电HDC
获得的GetDC()
。
此外,在释放或销毁HDC
中选择的资源之前,必须先将其选中。
但是,由于移动,调整窗口大小,取消隐藏窗口等原因,“无效”部分或全部客户区的结果确实可能收到WM_PAINT
消息。因此,为了响应WM_PAINT
消息,您应该执行完整的重新绘制,即要显示的所有项目。
答案 1 :(得分:0)
在WM_PAINT中而不是WM_LBUTTONDOWN,WM_MOUSEMOVE和WM_RBUTTONDOWN中绘制所有图形。在WM_LBUTTONDOWN,WM_MOUSEMOVE和WM_RBUTTONDOWN中保存要绘制的内容,然后调用Invalidate()发送WM_PAINT消息以绘制它们。您的绘图将一直显示。