Partilhar via


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.