Mappe messaggi derivate
Durante la gestione dei messaggi, controllare la mappa messaggi di una classe non è la fine della storia della mappa messaggi. Cosa accade se la classe CMyView
(derivata da CView
) non dispone di una voce corrispondente per un messaggio?
Tenere presente che CView
, la classe base di CMyView
, è derivata a sua volta da CWnd
. Di conseguenza CMyView
, è un CView
oggetto e è un oggetto CWnd
. Ognuna di queste classi dispone di una propria mappa messaggi. La figura seguente mostra la relazione gerarchica delle classi, ma tenere presente che un CMyView
oggetto è un singolo oggetto con le caratteristiche di tutte e tre le classi.
Gerarchia di una visualizzazione
Se non è possibile trovare una corrispondenza di un messaggio nella mappa messaggi della classe CMyView
, il framework cerca anche la mappa dei messaggi della relativa classe base immediata. La macro BEGIN_MESSAGE_MAP
all'inizio della mappa messaggi specifica due nomi di classe come argomenti:
BEGIN_MESSAGE_MAP(CMyView, CView)
Il primo argomento indica il nome della classe alla quale la mappa messaggi appartiene. Il secondo argomento fornisce una connessione con la classe base immediata, in questo caso CView
, in modo che il framework possa cercare anche la mappa dei messaggi.
I gestori messaggi forniti in una classe base sono quindi ereditati dalla classe derivata. È molto simile alle normali funzioni membro virtuali, senza la necessità di rendere virtuali tutte le funzioni membro del gestore.
Se nessun gestore viene trovato in una qualsiasi delle mappe messaggi della classe base, viene eseguita l'elaborazione predefinita. Se il messaggio è un comando, viene inviato dal framework alla destinazione di comando successiva. Se si tratta di un messaggio standard di Windows, il messaggio viene passato alla routine della finestra predefinita appropriata.
Per velocizzare la corrispondenza mappa-messaggio, il framework memorizza nella cache le corrispondenze recenti basandosi sulla probabilità che riceverà di nuovo lo stesso messaggio. Un vantaggio di questo comportamento è l'efficienza con cui il framework elabora i messaggi non gestiti. Le mappe messaggi sono anche più efficienti nello spazio delle implementazioni che utilizzano funzioni virtuali.