Invalidación del área de cliente

El sistema no es el único origen de WM_PAINT mensajes. La función InvalidateRect o InvalidateRgn puede generar indirectamente mensajes WM_PAINT para las ventanas. Estas funciones marcan todo o parte de un área de cliente como no válidas (que se deben volver a dibujar).

En el ejemplo siguiente, el procedimiento de ventana invalida todo el área de cliente al procesar WM_CHAR mensajes. Esto permite al usuario cambiar la figura escribiendo un número y ver los resultados; Estos resultados se dibujan en cuanto no hay otros mensajes en la cola de mensajes de la aplicación.

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; 

En este ejemplo, el argumento NULL utilizado por InvalidateRect especifica todo el área de cliente; el argumento TRUE hace que se borre el fondo. Si no desea que la aplicación espere hasta que la cola de mensajes de la aplicación no tenga ningún otro mensaje, use la función UpdateWindow para forzar que el mensaje de WM_PAINT se envíe inmediatamente. Si hay alguna parte no válida del área de cliente, UpdateWindow envía el mensaje WM_PAINT de la ventana especificada directamente al procedimiento de ventana.