最小化/最大化后,MFC窗口图形消失了

时间:2019-03-21 18:41:16

标签: c++ user-interface mfc

我试图使用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;

}

2 个答案:

答案 0 :(得分:1)

WM_PAINT消息的处理之外画图绝对是可以的:

Painting and Drawing

您应该致电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消息以绘制它们。您的绘图将一直显示。