Invalidazione dell'area cliente
Il sistema non è l'unica origine dei messaggi WM_PAINT. La funzione InvalidateRect o InvalidateRgn può generare indirettamente messaggi WM_PAINT per le tue finestre. Queste funzioni contrassegnano tutte o parte di un'area client come non valide (che devono essere ridisegnate).
Nell'esempio seguente la routine della finestra invalida l'intera area client durante l'elaborazione dei messaggi WM_CHAR. Ciò consente all'utente di modificare la figura digitando un numero e visualizzando i risultati; questi risultati vengono estratti non appena non sono presenti altri messaggi nella coda dei messaggi dell'applicazione.
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;
In questo esempio, l'argomento NULL utilizzato da InvalidateRect specifica l'intera area client; l'argomento TRUE fa sì che lo sfondo venga cancellato. Se non si vuole che l'applicazione attenda finché la coda di messaggi dell'applicazione non contiene altri messaggi, usare la funzione UpdateWindow per forzare l'invio immediato del messaggio WM_PAINT. Se è presente una parte non valida dell'area client, UpdateWindow invia il messaggio di WM_PAINT per la finestra specificata direttamente alla routine della finestra.