Compartilhar via


Pintando a janela

Você criou sua janela. Agora você quer mostrar algo dentro dele. Na terminologia do Windows, isso é chamado de pintura da janela. Para misturar metáforas, uma janela é uma tela em branco, esperando você preenchê-la.

Às vezes, seu programa iniciará a pintura para atualizar a aparência da janela. Em outros momentos, o sistema operacional notificará você de que você deve repintar uma parte da janela. Quando isso ocorre, o sistema operacional envia à janela uma mensagem WM_PAINT . A parte da janela que deve ser pintada é chamada de região de atualização.

Na primeira vez que uma janela é mostrada, toda a área do cliente da janela deve ser pintada. Portanto, você sempre receberá pelo menos uma mensagem WM_PAINT ao mostrar uma janela.

ilustração mostrando a região de atualização de uma janela

Você só é responsável por pintar a área do cliente. O quadro ao redor, incluindo a barra de título, é pintado automaticamente pelo sistema operacional. Depois de terminar de pintar a área do cliente, desmarque a região de atualização, que informa ao sistema operacional que ele não precisa enviar outro WM_PAINT mensagem até que algo seja alterado.

Agora, suponha que o usuário mova outra janela para que ela obscureça uma parte da janela. Quando a parte obscurecida fica visível novamente, essa parte é adicionada à região de atualização e sua janela recebe outra mensagem WM_PAINT .

ilustração mostrando como a região de atualização muda quando duas janelas se sobrepõem

A região de atualização também será alterada se o usuário esticar a janela. No diagrama a seguir, o usuário estende a janela para a direita. A área recém-exposta no lado direito da janela é adicionada à região de atualização:

ilustração mostrando como a região de atualização muda quando uma janela é redimensionada

Em nosso primeiro programa de exemplo, a rotina de pintura é muito simples. Ele apenas preenche toda a área do cliente com uma cor sólida. Ainda assim, este exemplo é suficiente para demonstrar alguns dos conceitos importantes.

switch (uMsg)
{
    case WM_PAINT:
    {
        PAINTSTRUCT ps;
        HDC hdc = BeginPaint(hwnd, &ps);

        // All painting occurs here, between BeginPaint and EndPaint.

        FillRect(hdc, &ps.rcPaint, (HBRUSH) (COLOR_WINDOW+1));

        EndPaint(hwnd, &ps);
    }
    return 0;
}

Inicie a operação de pintura chamando a função BeginPaint . Essa função preenche a estrutura PAINTSTRUCT com informações sobre a solicitação de repintar. A região de atualização atual é fornecida no membro rcPaint do PAINTSTRUCT. Essa região de atualização é definida em relação à área do cliente:

ilustração mostrando a origem da área do cliente

No código de pintura, você tem duas opções básicas:

  • Pinte toda a área do cliente, independentemente do tamanho da região de atualização. Tudo o que estiver fora da região de atualização é recortado. Ou seja, o sistema operacional o ignora.
  • Otimize pintando apenas a parte da janela dentro da região de atualização.

Se você sempre pintar toda a área do cliente, o código será mais simples. No entanto, se você tiver uma lógica de pintura complicada, poderá ser mais eficiente ignorar as áreas fora da região de atualização.

A linha de código a seguir preenche a região de atualização com uma única cor, usando a cor da tela de fundo da janela definida pelo sistema (COLOR_WINDOW). A cor real indicada por COLOR_WINDOW depende do esquema de cores atual do usuário.

FillRect(hdc, &ps.rcPaint, (HBRUSH) (COLOR_WINDOW+1));

Os detalhes do FillRect não são importantes para este exemplo, mas o segundo parâmetro fornece as coordenadas do retângulo a ser preenchido. Nesse caso, passamos toda a região de atualização (o membro rcPaint do PAINTSTRUCT). Na primeira WM_PAINT mensagem, toda a área do cliente precisa ser pintada, portanto, rcPaint conterá toda a área do cliente. Nas mensagens WM_PAINT subsequentes, rcPaint pode conter um retângulo menor.

A função FillRect faz parte da GDI (Graphics Device Interface), que alimenta os elementos gráficos do Windows há muito tempo. No Windows 7, a Microsoft introduziu um novo mecanismo gráfico, chamado Direct2D, que dá suporte a operações gráficas de alto desempenho, como aceleração de hardware. Direct2D também está disponível para o Windows Vista por meio do Platform Update para Windows Vista e do Windows Server 2008 por meio da Atualização de Plataforma para Windows Server 2008. (A GDI ainda tem suporte total.)

Depois de terminar de pintar, chame a função EndPaint . Essa função limpa a região de atualização, que sinaliza para o Windows que a janela concluiu a pintura em si.

Avançar

Fechando a janela