Redesenhar na região de atualização

Você pode limitar a quantidade de desenho que seu aplicativo realiza ao processar a mensagem WM_PAINT determinando o tamanho e o local da região de atualização. Como o sistema usa a região de atualização ao criar a região de recorte para o contexto do dispositivo de exibição da janela, você pode determinar indiretamente a região de atualização examinando a região de recorte.

No exemplo a seguir, o procedimento de janela desenha um triângulo, um retângulo, um pentágono e um hexágono, mas somente se toda ou uma parte de cada figura estiver dentro da região de atualização. O procedimento de janela usa a função RectVisible e um retângulo 100 por 100 para determinar se uma figura está dentro da região de recorte (e, portanto, a região de atualização) para o contexto de dispositivo comum recuperado por BeginPaint.

POINT aptTriangle[4]  = {50,2, 98,86,  2,86, 50,2}, 
      aptRectangle[5] = { 2,2, 98,2,  98,98,  2,98, 2,2}, 
      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}; 
  . 
  . 
  . 
 
        case WM_PAINT: 
            hdc = BeginPaint(hwnd, &ps); 
            SetRect(&rc, 0, 0, 100, 100); 
 
            if (RectVisible(hdc, &rc)) 
                Polyline(hdc, aptTriangle, 4); 
 
            SetViewportOrgEx(hdc, 100, 0, NULL); 
            if (RectVisible(hdc, &rc)) 
                Polyline(hdc, aptRectangle, 5); 
 
            SetViewportOrgEx(hdc, 0, 100, NULL); 
            if (RectVisible(hdc, &rc)) 
                Polyline(hdc, aptPentagon, 6); 
 
            SetViewportOrgEx(hdc, 100, 100, NULL); 
            if (RectVisible(hdc, &rc)) 
                Polyline(hdc, aptHexagon, 7); 
            EndPaint(hwnd, &ps); 
            return 0L; 
 
  . 
  . 
  . 

As coordenadas de cada figura neste exemplo estão dentro do mesmo retângulo 100 por 100. Antes de desenhar uma figura, o procedimento de janela define a origem do visor como uma parte diferente da área do cliente usando a função SetViewportOrgEx . Isso impede que os números sejam desenhados um sobre o outro. Alterar a origem do visor não afeta a região de recorte, mas afeta como as coordenadas do retângulo passado para RectVisible são interpretadas. Alterar a origem também permite que você use um único retângulo para marcar a região de atualização em vez de retângulos individuais para cada figura.