【问题标题】:MFC window graphic is gone after minimizing/maximizing最小化/最大化后 MFC 窗口图形消失了
【发布时间】:2019-08-12 16:59:39
【问题描述】:

我正在尝试使用 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;
}

LRESULT CALLBACK Mywndproc(HWND hwnd, UINT imessage, 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;

}

【问题讨论】:

    标签: c++ user-interface mfc


    【解决方案1】:

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

    Painting and Drawing

    您应该调用ReleaseDC() 而不是DeleteDC() 以返回您通过调用GetDC() 获得的HDC

    此外,您在HDC 中选择的资源必须在释放或销毁之前被选中。

    然而,WM_PAINT 消息确实可能会因为移动、调整大小、取消隐藏等窗口而“使”部分或全部客户区“无效”而收到。因此,为了响应WM_PAINT 消息,您应该执行完全重绘,即您想要显示的所有项目。

    【讨论】:

      【解决方案2】:

      在 WM_PAINT 中进行所有绘图,而不是 WM_LBUTTONDOWN、WM_MOUSEMOVE 和 WM_RBUTTONDOWN。将要绘制的内容保存在 WM_LBUTTONDOWN、WM_MOUSEMOVE 和 WM_RBUTTONDOWN 中,然后调用 Invalidate() 发送 WM_PAINT 消息来绘制它们。您的绘图将一直处于上升状态。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-08-02
        • 1970-01-01
        • 1970-01-01
        • 2012-02-29
        • 1970-01-01
        • 1970-01-01
        • 2021-10-29
        相关资源
        最近更新 更多