Invalidando a área do cliente
O sistema não é a única fonte de mensagens WM_PAINT . A função InvalidateRect ou InvalidateRgn pode gerar indiretamente WM_PAINT mensagens para suas janelas. Essas funções marcam toda ou parte de uma área de cliente como inválida (que deve ser redesenhada).
No exemplo a seguir, o procedimento de janela invalida toda a área do cliente ao processar mensagens WM_CHAR . Isso permite que o usuário altere a figura digitando um número e exibindo os resultados; esses resultados são desenhados assim que não há outras mensagens na fila de mensagens do aplicativo.
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;
Neste exemplo, o argumento NULL usado por InvalidateRect especifica toda a área do cliente; o argumento TRUE faz com que o plano de fundo seja apagado. Se você não quiser que o aplicativo aguarde até que a fila de mensagens do aplicativo não tenha outras mensagens, use a função UpdateWindow para forçar o envio imediato da mensagem WM_PAINT . Se houver alguma parte inválida da área do cliente, UpdateWindow enviará a mensagem WM_PAINT da janela especificada diretamente para o procedimento de janela.