Я на самом деле сталкиваюсь с проблемой при рисовании 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);
на каждомконтроль, но это не имело никакого эффекта.