Система не единственный источник сообщений WM_PAINT. Функция InvalidateRect или InvalidateRgn может косвенно генерировать сообщения WM_PAINT для Ваших окон. Эти функции отмечают всю или часть рабочей области как недопустимую (которая должна быть перерисована).
В примере ниже, оконная процедура делает всю рабочую область недействительной, обрабатывая сообщения WM_CHAR. Это дает возможность пользователю изменять фигуру, вводя с клавиатуры число и вид результатов; эти результаты рисуются, как только нет других сообщений в очереди сообщений приложения.
POINT aptPentagon[6] = {50,2, 98,35, 79,90, 21,90, 2,35, 50,2}, aptHexagon[7] = {50,2, 93,25, 93,75, 50,98, 7,75, 7,25, 50,2}; POINT *ppt = aptPentagon; int cpt = 6; . . . case WM_CHAR: switch (wParam) { case '5': ppt = aptPentagon; cpt = 6; break; case '6': ppt = aptHexagon; cpt = 7; break; } InvalidateRect(hwnd, NULL, TRUE); return 0L; case WM_PAINT: hdc = BeginPaint(hwnd, &ps); GetClientRect(hwnd, &rc); SetMapMode(hdc, MM_ANISOTROPIC); SetWindowExtEx(hdc, 100, 100, NULL); SetViewportExtEx(hdc, rc.right, rc.bottom, NULL); Polyline(hdc, ppt, cpt); EndPaint(hwnd, &ps); return 0L; |
В этом примере параметр NULL, используемый в функции InvalidateRect, определяет всю рабочую область; параметр TRUE заставляет фон быть стертым. Если Вы не хотите, чтобы приложение ждало до тех пор, пока в очереди сообщений приложения не будет никаких других сообщений, используйте функцию UpdateWindow, чтобы заставить сообщение WM_PAINT, отправиться немедленно. Если есть какая-либо недопустимая часть рабочей области, функция UpdateWindow отправляет сообщение WM_PAINT для заданного окна непосредственно в оконную процедуру.