Pochodne mapy komunikatów
Podczas obsługi komunikatów sprawdzanie własnej mapy komunikatów klasy nie jest końcem artykułu mapy komunikatów. Co się stanie, jeśli klasa CMyView
(pochodząca z CView
klasy ) nie ma pasującego wpisu dla komunikatu?
Należy pamiętać, że CView
klasa bazowa klasy CMyView
, jest z kolei pochodna z klasy CWnd
. W ten sposób CMyView
element jest elementem CView
i jest .CWnd
Każda z tych klas ma własną mapę komunikatów. Na poniższej ilustracji przedstawiono hierarchiczną relację klas, ale należy pamiętać, że obiekt jest pojedynczym obiektem CMyView
, który ma cechy wszystkich trzech klas.
Hierarchia widoku
Jeśli nie można dopasować komunikatu w mapie komunikatów klasy CMyView
, platforma przeszukuje również mapę komunikatów swojej natychmiastowej klasy bazowej. Makro BEGIN_MESSAGE_MAP
na początku mapy komunikatów określa dwie nazwy klas jako argumenty:
BEGIN_MESSAGE_MAP(CMyView, CView)
Pierwszy argument nazywa klasę, do której należy mapa komunikatów. Drugi argument zapewnia połączenie z natychmiastową klasą bazową, w tym przypadku CView
, dzięki czemu platforma może również przeszukiwać mapę komunikatów.
Programy obsługi komunikatów podane w klasie bazowej są zatem dziedziczone przez klasę pochodną. Jest to bardzo podobne do normalnych wirtualnych funkcji składowych bez konieczności tworzenia wirtualnych funkcji składowych programu obsługi.
Jeśli żadna procedura obsługi nie zostanie znaleziona w żadnej mapie komunikatów klasy bazowej, zostanie wykonane domyślne przetwarzanie komunikatu. Jeśli komunikat jest poleceniem, platforma kieruje ją do następnego miejsca docelowego polecenia. Jeśli jest to standardowy komunikat systemu Windows, komunikat jest przekazywany do odpowiedniej domyślnej procedury okna.
Aby przyspieszyć dopasowywanie mapy komunikatów, struktura buforuje ostatnie dopasowania na prawdopodobieństwo ponownego odebrania tego samego komunikatu. Jedną z konsekwencji jest to, że struktura przetwarza nieobsługiwane komunikaty dość wydajnie. Mapy komunikatów są również bardziej wydajne niż implementacje korzystające z funkcji wirtualnych.