Trapping-Nachrichten in MFC - Was ist der Unterschied?
Frage
Ich frage mich, was (wenn überhaupt) die Differenz zwischen den beiden folgenden Meldung Fallen in MFC für die Funktion war, OnSize (..).
1 - Via Nachricht Karte:
BEGIN_MESSAGE_MAP(CClassWnd, CBaseClassWnd)
...
ON_WM_SIZE()
..
END_MESSAGE_MAP()
2 - Via afx_message:
afx_msg type OnSize(...);
Sie scheinen austauschbar verwendet werden, die man verwendet werden soll oder es von anderen Faktoren abhängen?
Lösung
Beide Teile sind notwendig, um eine Message-Handler zu einer Klasse hinzuzufügen. Die Nachricht Karte sollte in Ihrer Klasse deklariert werden, zusammen mit Erklärungen für alle Message-Handler-Funktionen (beispielsweise OnSize
).
class CClassWnd : public CBaseClassWnd {
...
afx_msg void OnSize(UINT nType, int cx, int cy);
DECLARE_MESSAGE_MAP
};
afx_msg
ist nur ein leerer Platzhalter Makro - es ist nicht eigentlich nichts tut, sondern immer durch Konvention enthalten
Die Meldung Karte dann in der Klasse der CPP-Datei definiert ist:
BEGIN_MESSAGE_MAP(CClassWnd, CBaseClassWnd)
ON_WM_SIZE()
END_MESSAGE_MAP()
Diese Makros erzeugen für die Klasse eine Lookup-Tabelle, die durch das Fenster empfangenen Nachrichten können an den entsprechenden Handler-Funktionen geschickt werden. Die ON_WM_SIZE
Makro erlaubt die wParam
und lParam
Nachrichtenparameter in der WM_SIZE
Nachricht in aussagekräftiger Werte für die Nachrichtenhandhabungsfunktion (nType
, cx
und cy
in diesem Fall) decodiert werden. MFC bietet Makros für die meisten Fenstermeldungen (WM_LBUTTONDOWN
, WM_DESTROY
, etc).
Sie finden weitere Informationen finden, wie die Nachrichtenkarten Arbeit in MFC hier auf MSDN.
Andere Tipps
afx_msg ist nur ein leeres Makro, es ist im Grunde gibt es nur zu bezeichnen, dass das Verfahren ein MFC-Meldungshandler für Lesbarkeit. Auch bei afx_msg dort müssen Sie noch einen Eintrag in der Meldungszuordnung haben.
Einige der Nachricht Windows sind bereits behandelt von MFC , so in diesen Fällen können Sie mit dem Hinzufügen von nur die Methode der abgeleiteten Klasse wegzukommen.
Zum Beispiel die CWnd Klasse (wie viele andere MFC-Klassen zu tun), die bereits Karten ein paar Windows-Nachrichten in es Nachricht Karte (dh ON_WM_DRAWITEM ON_WM_MEASUREITEM ON_WM_ENTERIDLE etc, etc).
Aber eine andere Meldung nicht bereits von MFC zugeordnet wird sowohl eine Klassenmethode und einen Eintrag in der Meldungszuordnung haben muß, für sie zu arbeiten.