A mensagem WM_PAINT
Normalmente, um aplicativo desenha em uma janela em resposta a uma mensagem WM_PAINT . O sistema envia essa mensagem para um procedimento de janela quando as alterações na janela alteraram o conteúdo da área do cliente. O sistema enviará a mensagem somente se não houver outras mensagens na fila de mensagens do aplicativo.
Ao receber uma mensagem WM_PAINT , um aplicativo pode chamar BeginPaint para recuperar o contexto do dispositivo de exibição para a área do cliente e usá-lo em chamadas para funções GDI para realizar quaisquer operações de desenho necessárias para atualizar a área do cliente. Depois de concluir as operações de desenho, o aplicativo chama a função EndPaint para liberar o contexto do dispositivo de exibição.
Antes de BeginPaint retornar o contexto do dispositivo de exibição, o sistema prepara o contexto do dispositivo para a janela especificada. Primeiro, ele define a região de recorte para que o contexto do dispositivo seja igual à interseção da parte da janela que precisa de atualização e a parte visível para o usuário. Somente as partes da janela que foram alteradas são redesenhadas. As tentativas de desenhar fora dessa região são recortadas e não aparecem na tela.
O sistema também pode enviar mensagens WM_NCPAINT e WM_ERASEBKGND para o procedimento de janela antes que BeginPaint retorne. Essas mensagens direcionam o aplicativo para desenhar a área não cliente e o plano de fundo da janela. A área não cliente é a parte de uma janela que está fora da área do cliente. A área inclui recursos como a barra de título, o menu da janela (também conhecido como menu Sistema ) e as barras de rolagem. A maioria dos aplicativos depende da função de janela padrão , DefWindowProc, para desenhar essa área e, portanto, passar a mensagem WM_NCPAINT para essa função. A tela de fundo da janela é a cor ou o padrão com o qual uma janela é preenchida antes do início de outras operações de desenho. A tela de fundo abrange todas as imagens anteriormente na janela ou na tela sob a janela. Se uma janela pertencer a uma classe de janela com um pincel de plano de fundo de classe, a função DefWindowProc desenha automaticamente a tela de fundo da janela.
BeginPaint preenche uma estrutura PAINTSTRUCT com informações como as dimensões da parte da janela a ser atualizada e um sinalizador que indica se a tela de fundo da janela foi desenhada. O aplicativo pode usar essas informações para otimizar o desenho. Por exemplo, ele pode usar as dimensões da região de atualização, especificadas pelo membro rcPaint , para limitar o desenho apenas às partes da janela que precisam ser atualizadas. Se um aplicativo tiver uma saída muito simples, ele poderá ignorar a região de atualização e desenhar em toda a janela, contando com o sistema para descartar (cortar) qualquer saída desnecessária. Como o desenho de clipes do sistema que se estende fora da região de recorte, apenas o desenho que está na região de atualização fica visível.
BeginPaint define a região de atualização de uma janela como NULL. Isso limpa a região, impedindo que ela gere mensagens WM_PAINT subsequentes. Se um aplicativo processar um WM_PAINT mensagem, mas não chamar BeginPaint ou desmarcar a região de atualização, o aplicativo continuará recebendo mensagens WM_PAINT desde que a região não esteja vazia. Em todos os casos, um aplicativo deve limpar a região de atualização antes de retornar da mensagem WM_PAINT .
Depois que o aplicativo terminar de desenhar, ele deverá chamar EndPaint. Para a maioria das janelas, EndPaint libera o contexto do dispositivo de exibição, tornando-o disponível para outras janelas. EndPaint também mostra o cursor, se ele foi ocultado anteriormente por BeginPaint. BeginPaint oculta o cursor para impedir que as operações de desenho o corrompam.
- A região de atualização
- Invalidando e validando a região de atualização
- Recuperando a região de atualização
- Excluindo a região de atualização
- Desenho síncrono e assíncrono