Окно не перерисовывается после восстановления из свернутого состояния - PullRequest
0 голосов
/ 18 октября 2019

Я на самом деле сталкиваюсь с проблемой при рисовании WinAPI.

Я создаю свои элементы управления следующим образом:

case WM_CREATE:
        g_font = CreateFont(16, 0, 0, 0, FW_DONTCARE, FALSE, FALSE, FALSE, ANSI_CHARSET, CLIP_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, FF_DONTCARE, "MS Dlg Shell");

        g_staticTextToEncrypt = CreateWindowEx(0, "STATIC", "Entrez le texte que vous voulez chiffrer:", WS_CHILD | WS_VISIBLE, 0, 0, 0, 0, window, NULL, GetModuleHandle(NULL), NULL); SendMessage(g_staticTextToEncrypt, WM_SETFONT, (WPARAM)g_font, (LPARAM)TRUE);
        g_staticTextAlphabet = CreateWindowEx(0, "STATIC", "Entrez votre alphabet de substitution:", WS_CHILD | WS_VISIBLE, 0, 0, 0, 0, window, NULL, GetModuleHandle(NULL), NULL); SendMessage(g_staticTextAlphabet, WM_SETFONT, (WPARAM)g_font, (LPARAM)TRUE);
        g_staticEncryptedText = CreateWindowEx(0, "STATIC", "Message chiffré:", WS_CHILD | WS_VISIBLE, 0, 0, 0, 0, window, NULL, GetModuleHandle(NULL), NULL); SendMessage(g_staticEncryptedText, WM_SETFONT, (WPARAM)g_font, (LPARAM)TRUE);

        g_editInputMessage = CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", "", WS_CHILD | WS_VISIBLE | ES_LEFT | ES_AUTOHSCROLL | ES_UPPERCASE, 0, 0, 0, 0, window, (HMENU)ID_EDIT_INPUT_MESSAGE, NULL, NULL); SendMessage(g_editInputMessage, WM_SETFONT, (WPARAM)g_font, (LPARAM)TRUE);
        g_editInputAlphabet = CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", "", WS_CHILD | WS_VISIBLE | ES_LEFT | ES_AUTOHSCROLL | ES_UPPERCASE, 0, 0, 0, 0, window, (HMENU)ID_EDIT_INPUT_ALPHABET, NULL, NULL); SendMessage(g_editInputAlphabet, WM_SETFONT, (WPARAM)g_font, (LPARAM)TRUE);
        g_editOutputEncryptedText = CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", "", WS_CHILD | WS_VISIBLE | ES_CENTER | ES_AUTOHSCROLL | ES_READONLY, 0, 0, 0, 0, window, (HMENU)ID_EDIT_OUTPUT_ENCRYPTED_TEXT, NULL, NULL); SendMessage(g_editOutputEncryptedText, WM_SETFONT, (WPARAM)g_font, (LPARAM)TRUE);

        g_buttonCopyEncryptedText = CreateWindowEx(0, "BUTTON", "Copier", WS_CHILD | WS_VISIBLE | BS_CENTER, 0, 0, 0, 0, window, ID_BUTTON_COPY_ENCRYPTED_TEXT, NULL, NULL); SendMessage(g_buttonCopyEncryptedText, WM_SETFONT, (WPARAM)g_font, (LPARAM)TRUE);

        break;

, поэтому я могу держать их по центру, даже когдаразмер окна был изменен пользователем, я обрабатываю сообщение WM_PAINT:

case WM_PAINT:
        BeginPaint(window, &ps);

        hdc = GetDC(g_staticTextToEncrypt);
        SelectObject(hdc, g_font);
        GetTextMetrics(hdc, &tm);
        ReleaseDC(g_staticTextToEncrypt, hdc);

        GetWindowRect(window, &windowSize);
        setNewControlsPos(&windowSize, &tm);

        EndPaint(window, &ps);
        break;

setNewControlsPos просто выполняет SetWindowPos(g_staticTextToEncrypt, HWND_BOTTOM, ..., ..., ..., ..., SWP_SHOWWINDOW); для каждого элемента управления, созданного в WM_CREATE

Проблема в том, чтоКогда я свернул окно и восстановил его, окно стало белым, все элементы управления исчезли в дикой природе. Я думаю, что проблема заключается в том, что я не перерисовываю элементы управления в WM_PAINT, а только переставляю их, но не могу понять, как правильно перекрасить элементы управления.

Я пытался использовать RedrawWindow(..., NULL, NULL, RDW_ERASE | RDW_INVALIDATE); или InvalidateRect(..., NULL, FALSE); на каждомконтроль, но это не имело никакого эффекта.

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