Benutzer mit den meisten Antworten
Nachrichtenverarbeitung

Frage
-
Hey Leute, ich habe eine Frage zur Nachrichtenverarbeitung bei Visual C++ bzw MFC.
Wenn ich zum Beispiel ne Klasse myDialog habe, welche von CDialogEx abgeleitet ist, und bei dieser Klasse ne Funktion über den Klassenassistent erstelle, die auf WM_MouseMove reagiert, dann heißt die Funtkion ja myDialog::OnMouseMove( parameters ).
Wieso steht dann in der Implementierung dieser Funktion immer am Ende ein Aufruf an CDialogEx::OnMouseMove( paramters )?Verstehe ich leider nicht.
Außerdem würde mich interessieren wie das realisiert wird, dass die OnMouseMove Funktion auf die Nachricht WM_MouseMove reagiert, wie oder wo ist das verknüpft?
Danke schonmal für Eure Hilfe
Gruß freeG
Antworten
-
Hallo fr33g!
Wieso steht dann in der Implementierung dieser Funktion immer am Ende ein Aufruf an CDialogEx::OnMouseMove( paramters )?Verstehe ich leider nicht.
Bei C++ arbeitet man ja oft mit "virtuellen" Methoden. Diese können abgeleitet und überladen werden. Damit aber auch noch die "Basis-Methode" aufgerufrn wird, muss man dies von "Hand" in der überladenen Methode machen. Dies geschieht hier.
Zum besseren Verständniss kannst Du auch "CDialogEx::OnMouseMove" durch "__super::OnMouseMove" ersetzen...
Damit erkennt man dann besser, dass dies ein Aufruf der Methode der abgeleiteten Klassen ist.
> Außerdem würde mich interessieren wie das realisiert wird, dass die OnMouseMove Funktion auf die Nachricht WM_MouseMove reagiert, wie oder wo ist das verknüpft?Da gibt es eine Message-Map.
Siehe:
http://msdn.microsoft.com/en-us/library/0x0cx6b1
http://msdn.microsoft.com/en-us/library/6d1asasd
Jochen Kalmbach (MVP VC++)- Als Antwort vorgeschlagen Jochen Kalmbach Mittwoch, 7. Juli 2010 06:26
- Als Antwort markiert Robert BreitenhoferModerator Montag, 19. Juli 2010 11:08
-
Die Klassennamen in BEGIN_MESSAGE_MAP stehen für den Namen der Klasse für die die Map definiert wird und den Namen der Basisklasse an deren Map die Nachricht weitergeleitet wird, wenn sie nicht behandelt werden konnte.
Nachrichten werden nicht einfach an "alle" Fenster gesendet die "warten". Es steht in den Beschreibungen der Windows Nachrichten, wer diese erhält. WM_COMMAND Nachrichten werden typischerweise an die Parent Fenster gesendet.
Andere Notifications (Maus/Tastatur) immer nur an das Fenster an die sie gerichtet sind, bzw. den Focus haben.
Für wieder andere Nachrichten kann man sich anmelden. etc. etc. etc.
Letzten Endes entscheidet derjenige der die Nachricht sendet mit PostMessage/SendMessage wer diese erhalten soll... Es gibt eigentlich kam Nachrichten die ins Blaue gesendet werden.
Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de- Als Antwort vorgeschlagen Martin RichterModerator Montag, 12. Juli 2010 06:44
- Als Antwort markiert Robert BreitenhoferModerator Montag, 19. Juli 2010 11:08
Alle Antworten
-
Hallo fr33g!
Wieso steht dann in der Implementierung dieser Funktion immer am Ende ein Aufruf an CDialogEx::OnMouseMove( paramters )?Verstehe ich leider nicht.
Bei C++ arbeitet man ja oft mit "virtuellen" Methoden. Diese können abgeleitet und überladen werden. Damit aber auch noch die "Basis-Methode" aufgerufrn wird, muss man dies von "Hand" in der überladenen Methode machen. Dies geschieht hier.
Zum besseren Verständniss kannst Du auch "CDialogEx::OnMouseMove" durch "__super::OnMouseMove" ersetzen...
Damit erkennt man dann besser, dass dies ein Aufruf der Methode der abgeleiteten Klassen ist.
> Außerdem würde mich interessieren wie das realisiert wird, dass die OnMouseMove Funktion auf die Nachricht WM_MouseMove reagiert, wie oder wo ist das verknüpft?Da gibt es eine Message-Map.
Siehe:
http://msdn.microsoft.com/en-us/library/0x0cx6b1
http://msdn.microsoft.com/en-us/library/6d1asasd
Jochen Kalmbach (MVP VC++)- Als Antwort vorgeschlagen Jochen Kalmbach Mittwoch, 7. Juli 2010 06:26
- Als Antwort markiert Robert BreitenhoferModerator Montag, 19. Juli 2010 11:08
-
Ok, so weit verstehe ich das.
Aber was heißt bei "BEGIN_MESSAGE_MAP( CMyDoc, CDocument ) das CMyDoc und das CDocument? Also für was steht das?
Genau so würd ich gern wissen, wenn jetzt zum Beipsiel ein Button geklickt wird, sendet dann der Button selber die Nachricht los oder Windows? Die Nachricht wird dann an jede Applikation gegeben die auf Messages wartet oder wie? Und dort wird sie dann durch die Message_Map eben an die richtige Member-Funktion weitergeleitet oder?
Und die Struktur einer Nachricht sieht doch so aus:
typedef struct tagMSG { HWND hwnd; UINT message; WPARAM wParam; LPARAM lParam; DWORD time; POINT pt; } MSG;
So hwnd ist ja der Handler, also der Empfänger der Nachricht, wie weiß der jenige der die Nachricht versendet, beim versenden schon wer der Empfänger ist?
Versteh ich leider net so ganz, wär cool wenn mir das jemand erläutern könnte.
Vielen Dank schonmal
Gruß freeG
-
Die Klassennamen in BEGIN_MESSAGE_MAP stehen für den Namen der Klasse für die die Map definiert wird und den Namen der Basisklasse an deren Map die Nachricht weitergeleitet wird, wenn sie nicht behandelt werden konnte.
Nachrichten werden nicht einfach an "alle" Fenster gesendet die "warten". Es steht in den Beschreibungen der Windows Nachrichten, wer diese erhält. WM_COMMAND Nachrichten werden typischerweise an die Parent Fenster gesendet.
Andere Notifications (Maus/Tastatur) immer nur an das Fenster an die sie gerichtet sind, bzw. den Focus haben.
Für wieder andere Nachrichten kann man sich anmelden. etc. etc. etc.
Letzten Endes entscheidet derjenige der die Nachricht sendet mit PostMessage/SendMessage wer diese erhalten soll... Es gibt eigentlich kam Nachrichten die ins Blaue gesendet werden.
Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de- Als Antwort vorgeschlagen Martin RichterModerator Montag, 12. Juli 2010 06:44
- Als Antwort markiert Robert BreitenhoferModerator Montag, 19. Juli 2010 11:08