Mensagem WM_PAINT
Normalmente, um aplicativo desenha em uma janela em resposta a uma mensagem WM_PAINT. O sistema envia esta mensagem para um procedimento de janela quando as alterações na janela alteraram o conteúdo da área do cliente. O sistema envia 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, defina a região de recorte do contexto do dispositivo para que seja igual à interseção da parte da janela que precisa de atualização com a parte que é visível ao utilizador. Apenas as partes da janela que foram alteradas são redesenhadas. As tentativas de desenhar fora dessa região são cortadas 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 de cliente. A área inclui recursos como a barra de título, o menu da janela (também conhecido como o menu do Sistema) e barras de rolagem. A maioria dos aplicativos dependem da função de janela padrão, DefWindowProc, para desenhar essa área e, portanto, passar a mensagem WM_NCPAINT para essa função. O de fundo da janela é a cor ou o padrão com o qual uma janela é preenchida antes de outras operações de desenho começarem. O fundo cobre 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 fundo de classe, a função DefWindowProc desenha o plano de fundo da janela automaticamente.
BeginPaint preenche a estrutura PAINTSTRUCTcom informações, tais como as dimensões da porção da janela que será atualizada e um indicador que assinala se o fundo da janela foi desenhado. 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 de atualização. Se um aplicativo tiver uma saída muito simples, ele pode ignorar a região de atualização e desenhar em toda a janela, confiando no sistema para descartar (clipar) qualquer saída desnecessária. Como o sistema corta o desenho que se estende para fora da região de recorte, só é visível o desenho que está na zona de atualização.
BeginPaint define a região de atualização de uma janela como NULL. Isso limpa a região, evitando a geração de mensagens subsequentes WM_PAINT. Se um aplicativo processar uma mensagem WM_PAINT, mas não chamar BeginPaint ou limpar a região de atualização, o aplicativo continuará a receber mensagens WM_PAINT enquanto a região não estiver 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 deve 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 anteriormente oculto por BeginPaint. BeginPaint oculta o caret para evitar 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