Abgeleitete Meldungszuordnungen
Während der Nachrichtenverarbeitung ist die Überprüfung der eigenen Nachrichtenzuordnung einer Klasse nicht das Ende des Nachrichtenzuordnungsabschnitts. Was geschieht, wenn die Klasse CMyView
(abgeleitet von CView
) keinen übereinstimmenden Eintrag für eine Nachricht hat?
Denken Sie daran, dass CView
, die Basisklasse von CMyView
, wiederum von CWnd
. So CMyView
ist ein CView
und ist ein CWnd
. Jede dieser Klassen verfügt über eine eigene Nachrichtenzuordnung. Die folgende Abbildung zeigt die hierarchische Beziehung der Klassen, bedenken Sie jedoch, dass ein CMyView
Objekt ein einzelnes Objekt ist, das die Merkmale aller drei Klassen aufweist.
Eine Ansichtshierarchie
Wenn eine Nachricht nicht in der Nachrichtenzuordnung der Klasse CMyView
abgeglichen werden kann, durchsucht das Framework auch die Nachrichtenzuordnung seiner unmittelbaren Basisklasse. Das BEGIN_MESSAGE_MAP
Makro am Anfang der Nachrichtenzuordnung gibt zwei Klassennamen als Argumente an:
BEGIN_MESSAGE_MAP(CMyView, CView)
Das erste Argument benennt die Klasse, zu der die Nachrichtenzuordnung gehört. Das zweite Argument stellt eine Verbindung mit der unmittelbaren Basisklasse bereit, in diesem Fall CView
, damit das Framework auch seine Nachrichtenzuordnung durchsuchen kann.
Die in einer Basisklasse bereitgestellten Nachrichtenhandler werden somit von der abgeleiteten Klasse geerbt. Dies ist sehr ähnlich wie normale virtuelle Memberfunktionen, ohne alle Handlermemmingfunktionen virtualisieren zu müssen.
Wenn kein Handler in einer der Basisklassennachrichtenzuordnungen gefunden wird, wird die Standardverarbeitung der Nachricht ausgeführt. Wenn es sich bei der Nachricht um einen Befehl handelt, leitet es das Framework an das nächste Befehlsziel weiter. Wenn es sich um eine Windows-Standardnachricht handelt, wird die Nachricht an die entsprechende Standardfensterprozedur übergeben.
Um den Nachrichtenzuordnungsabgleich zu beschleunigen, speichert das Framework die letzten Übereinstimmungen zwischen, um die Wahrscheinlichkeit zu ermitteln, dass sie dieselbe Nachricht erneut empfängt. Eine Folge davon ist, dass das Framework unbehandelte Nachrichten recht effizient verarbeitet. Nachrichtenzuordnungen sind auch effizienter als Implementierungen, die virtuelle Funktionen verwenden.