Mapas de Mensagem (ATL)
Um mapa de mensagens associa uma função de manipulador a uma mensagem, um comando ou uma notificação específico. Usando macros de mapa de mensagens da ATL, você pode especificar um mapa de mensagens para uma janela. Os procedimentos de janela em CWindowImpl
, CDialogImpl
e CContainedWindowT
direcionam as mensagens de uma janela para seu mapa de mensagens.
As funções do manipulador de mensagens aceitam um argumento adicional do tipo BOOL&
. Esse argumento indica se uma mensagem foi processada e está definida como TRUE por padrão. Em seguida, uma função de manipulador pode definir o argumento como FALSE para indicar que ele não lidou com uma mensagem. Nesse caso, a ATL continuará procurando uma função de manipulador mais adiante no mapa da mensagem. Ao definir esse argumento como FALSE, primeiro você pode executar alguma ação em resposta a uma mensagem e, em seguida, permitir que o processamento padrão ou outra função de manipulador termine de lidar com a mensagem.
Mapas de Mensagens Encadeadas
A ATL também permite encadear mapas de mensagens, o que direciona o tratamento de mensagens para um mapa de mensagens definido em outra classe. Por exemplo, é possível implementar o tratamento de mensagens comuns em uma classe separada para fornecer um comportamento uniforme para todo o encadeamento de janelas para essa classe. Você pode encadear a uma classe base ou a um membro de dados de sua classe.
A ATL também dá suporte ao encadeamento dinâmico, o que permite encadear o mapa de mensagens de outro objeto em tempo de execução. Para implementar o encadeamento dinâmico, você deve derivar sua classe do CDynamicChain. Em seguida, declare a macro CHAIN_MSG_MAP_DYNAMIC no mapa da mensagem. CHAIN_MSG_MAP_DYNAMIC requer um número exclusivo que identifica o objeto e o mapa da mensagem ao qual você está encadeando. Você deve definir esse valor exclusivo por meio de uma chamada para CDynamicChain::SetChainEntry
.
É possível encadear qualquer classe que declare um mapa de mensagens, desde que a classe seja derivada de CMessageMap. CMessageMap
permite que um objeto exponha seus mapas de mensagem a outros objetos. Observe que CWindowImpl
já deriva de CMessageMap
.
Mapas de Mensagens Alternativos
Por fim, a ATL dá suporte a mapas de mensagens alternativos, declarados com a macro ALT_MSG_MAP. Cada mapa de mensagem alternativo é identificado por um número exclusivo, que você passa para ALT_MSG_MAP. Usando mapas de mensagens alternativos, você pode lidar com as mensagens de várias janelas em um mapa. Observe que, por padrão, CWindowImpl
não usa mapas de mensagens alternativos. Para adicionar esse suporte, substitua o método WindowProc
em sua classe CWindowImpl
derivada e chame ProcessWindowMessage
com o identificador do mapa de mensagens.