Invalidation de la zone cliente
Le système n’est pas la seule source de messages WM_PAINT . La fonction InvalidateRect ou InvalidateRgn peut générer indirectement WM_PAINT messages pour vos fenêtres. Ces fonctions marquent la totalité ou une partie d’une zone client comme non valide (qui doit être redessinée).
Dans l’exemple suivant, la procédure de fenêtre invalide toute la zone cliente lors du traitement des messages WM_CHAR . Cela permet à l’utilisateur de modifier la figure en tapant un nombre et en affichant les résultats ; ces résultats sont dessinés dès qu’il n’y a pas d’autres messages dans la file d’attente de messages de l’application.
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;
Dans cet exemple, l’argument NULL utilisé par InvalidateRect spécifie l’ensemble de la zone cliente ; l’argument TRUE entraîne l’effacement de l’arrière-plan. Si vous ne souhaitez pas que l’application attende que la file d’attente de messages de l’application n’ait pas d’autres messages, utilisez la fonction UpdateWindow pour forcer l’envoi immédiat du message WM_PAINT. S’il existe une partie non valide de la zone cliente, UpdateWindow envoie le message WM_PAINT pour la fenêtre spécifiée directement à la procédure de fenêtre.