Аннулирование клиентской области
Система не является единственным источником WM_PAINT сообщений. Функция InvalidateRect или InvalidateRgn может косвенно создавать WM_PAINT сообщения для ваших окон. Эти функции помечают всю или часть клиентской области как недопустимую (которую необходимо перерисовать).
В следующем примере процедура окна делает недействительной всю клиентную область при обработке WM_CHAR сообщений. Это позволяет пользователю изменять фигуру, вводя число и просматривая результаты; Эти результаты отрисовываются, как только в очереди сообщений приложения отсутствуют другие сообщения.
RECT rc;
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 для указанного окна непосредственно в процедуру окна.