Графика окна MFC исчезла после сворачивания / сворачивания - PullRequest
0 голосов
/ 21 марта 2019

Я пытаюсь создать окно Windows и изображение внутри него, используя MFC, но после сворачивания или разворачивания окна рисунок исчезает. Есть ли способ, чтобы рисунок все еще работал после свертывания или свертывания?

Это код, который я написал.

#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;

}

Ответы [ 2 ]

1 голос
/ 22 марта 2019

Рисование вне обработки сообщения WM_PAINT абсолютно нормально:

Живопись и графика

Вы должны позвонить ReleaseDC(), а не DeleteDC(), чтобы вернуть HDC, полученный при вызове GetDC().

Кроме того, ресурсы, которые вы выбираете в HDC, должны быть выбраны перед его освобождением или уничтожением.

Однако сообщение WM_PAINT действительно может быть получено в результате «аннулирования» части или всей клиентской области из-за перемещения, изменения размера, отображения и т. Д. Окна. Поэтому в ответ на сообщение WM_PAINT вы должны выполнить полную перерисовку, то есть все элементы, которые вы хотите отобразить.

0 голосов
/ 21 марта 2019

Делайте все свои рисунки в WM_PAINT, а не в WM_LBUTTONDOWN, WM_MOUSEMOVE и WM_RBUTTONDOWN.Сохраните то, что вы хотите нарисовать, в WM_LBUTTONDOWN, WM_MOUSEMOVE и WM_RBUTTONDOWN и вызовите Invalidate (), чтобы отправить сообщение WM_PAINT для их рисования.Ваш рисунок будет все время.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...