Invalidazione dell'area client

Il sistema non è l'unica origine dei messaggi di WM_PAINT . La funzione InvalidateRect o InvalidateRgn può generare indirettamente messaggi WM_PAINT per le finestre. Queste funzioni contrassegnano tutte o parte di un'area client come non valide (che devono essere ridisegnate).

Nell'esempio seguente la procedura della finestra invalida l'intera area client durante l'elaborazione di messaggi di 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 usato da InvalidateRect specifica l'intera area client; l'argomento TRUE causa l'cancellazione dello sfondo. Se non si vuole che l'applicazione attenda finché la coda di messaggi dell'applicazione non ha altri messaggi, usare la funzione UpdateWindow per forzare l'invio immediato del messaggio di WM_PAINT . Se è presente una parte non valida dell'area client, UpdateWindow invia il messaggio di WM_PAINT per la finestra specificata direttamente alla procedura della finestra.