Mappe di messaggi (ATL)
Una mappa messaggi associa una funzione del gestore a un determinato messaggio, comando o notifica. Usando le macro della mappa messaggi di ATL, è possibile specificare una mappa messaggi per una finestra. Le procedure della finestra in CWindowImpl
CDialogImpl
, e CContainedWindowT
indirizzano i messaggi di una finestra alla relativa mappa messaggi.
Le funzioni del gestore di messaggi accettano un argomento aggiuntivo di tipo BOOL&
. Questo argomento indica se un messaggio è stato elaborato ed è impostato su TRUE per impostazione predefinita. Una funzione del gestore può quindi impostare l'argomento su FALSE per indicare che non ha gestito un messaggio. In questo caso, ATL continuerà a cercare una funzione del gestore più avanti nella mappa dei messaggi. Impostando questo argomento su FALSE, è prima possibile eseguire alcune azioni in risposta a un messaggio e quindi consentire l'elaborazione predefinita o un'altra funzione del gestore per completare la gestione del messaggio.
Mappe messaggi concatenati
ATL consente inoltre di concatenare le mappe dei messaggi, che indirizzano la gestione dei messaggi a una mappa messaggi definita in un'altra classe. Ad esempio, è possibile implementare la gestione comune dei messaggi in una classe separata per fornire un comportamento uniforme per tutte le finestre concatenamento a tale classe. È possibile concatenare a una classe base o a un membro dati della classe.
ATL supporta anche il concatenamento dinamico, che consente di concatenare la mappa messaggi di un altro oggetto in fase di esecuzione. Per implementare il concatenamento dinamico, è necessario derivare la classe da CDynamicChain. Dichiarare quindi la macro CHAIN_MSG_MAP_DYNAMIC nella mappa dei messaggi. CHAIN_MSG_MAP_DYNAMIC richiede un numero univoco che identifica l'oggetto e la mappa del messaggio a cui si sta concatenando. È necessario definire questo valore univoco tramite una chiamata a CDynamicChain::SetChainEntry
.
È possibile concatenare a qualsiasi classe che dichiara una mappa messaggi, purché la classe derivi da CMessageMap. CMessageMap
consente a un oggetto di esporre il relativo mapping dei messaggi ad altri oggetti. Si noti che CWindowImpl
deriva già da CMessageMap
.
Mappe messaggi alternative
ATL supporta infine mappe messaggi alternative, dichiarate con la macro ALT_MSG_MAP . Ogni mappa messaggi alternativa viene identificata da un numero univoco, che si passa a ALT_MSG_MAP. Usando mappe messaggi alternative, è possibile gestire i messaggi di più finestre in una mappa. Si noti che per impostazione predefinita, CWindowImpl
non usa mappe messaggi alternative. Per aggiungere questo supporto, eseguire l'override del WindowProc
metodo nella CWindowImpl
classe derivata da e chiamare ProcessWindowMessage
con l'identificatore della mappa messaggi.