BEGIN_MESSAGE_MAP
-
In einer Klasse habe ich einen Zeiger auf einen Dialog.
Nun möchte ich beim Beenden des Dialogs eine Nachricht an meine Klasse senden.Meine Frage nun wie kann ich meiner Klasse einen Nachrichtenschleife einfügen.
Bei BEGIN_MESSAGE_MAP(), muss ich ja den Klassennamen und die Basisklasse angeben.
Allerdings hat meine Klasse keine Basisklasse.
-
y-vonne schrieb:
In einer Klasse habe ich einen Zeiger auf einen Dialog.
Nun möchte ich beim Beenden des Dialogs eine Nachricht an meine Klasse senden.Meine Frage nun wie kann ich meiner Klasse einen Nachrichtenschleife einfügen.
Bei BEGIN_MESSAGE_MAP(), muss ich ja den Klassennamen und die Basisklasse angeben.
Allerdings hat meine Klasse keine Basisklasse.Nein, mit dem Macro geht das nicht. Schau dir mal SendMessage oder PostMessage an. Das sind deine Freunde...
-
Ja SendMessage verwende ich ja in meiner Dialogklasse um die Nachricht zu senden. In meiner anderen Klasse möchte ich ja aber gerne die Nachricht abfangen. Dazu muss ich mir ja die Message Map definieren.
-
Sorry, da hatte ich das überlesen. Du musst dir eine Nachrichtenbehandlungsroutine (Stichwort OnMessage) schaffen und in der Klasse eine entsprechende Funktion, die dann automatisch aufgerufen wird. Schau mal hier: http://www.cpp-tutor.de/mfc/mfc/kap3/lektion5.htm
Dort ist exemplarisch beschrieben wie das geht...
-
Ja ich weiß dass ich dass machen muss. Das war doch nicht die Frage. Ich habe doch geschrieben dass ich das Makro BEGIN_MESSAGE_MAP() einsetzten muss. Allerdings muss ich dort 2 Parameter angeben die Klasse selber und die Basisklasse. Habe aber keine Basisklasse. Nun war die Frage was ich da machen muss.
-
Nur Objekte die von CWnd abgeleitet sind können Nachrichten erhalten. Andere Klassen nicht. Ausnahmen bilden Klassen des Types CCmdTarget, die auch WM_COMMAND Nachrichten bearbeiten können.
-
Ok. Nun die Frage kann ich meine Klasse nun einfach von CWnd ableiten?
-
Oder anders gefragt. Gibt es eine andere Möglichkeit den Zeiger auf NULL zu setzen. Habe hier in meinem Buch gelesen:
In der Methode PostNcDestroy das Objekt mit delete this löschen. Eine Nachricht an den Aufrufer zu senden und dort die Nachricht abfangen und das Objekt auf NULL setzen.
-
y-vonne schrieb:
Ok. Nun die Frage kann ich meine Klasse nun einfach von CWnd ableiten?
Wenn du das bei der Definition der Klasse angbibst, dann ja.
class DeineKlasse : public CWnd { ... }
@Martin: Kann man nicht nachträglich Klassen mit einer Nachrichtenbehandlungsroutine ausstatten oder war das nur wieder irgendein Gefrickel? Stichwort:
... while(GetMessage(&msg,NULL,0,0)) { // Nachricht an die Callbackfunktion senden TranslateMessage(&msg); DispatchMessage(&msg); } ...
-
Wenn du das bei der Definition der Klasse angbibst, dann ja.
Ja klar wo sonst. Es war nicht die Frage wie es geht sondern ob es nicht zu irgendwelchen Problemen führt.
-
1. SendMessage benötigt ein gültiges HWND, wie soll also eine Klasse eine Nachricht haben, die kein Fenster ist.
Wenn das Fenster ein NULL Handle hat, kann es auch keine Nachrichten empfangen.
2. Ausnahmen bilden (wie ich schon schrieb) Klassen des Types CCmdTarget, die sind im Message-Routing für WM_COMMAND Nachrichten drin.Aber warum so kompliziert?
Über gib dem Dialog einen Zeiger auf Deine Klasse, oder ein Interface Deiner Klasse und Ruf die Funktion auf.
-
Noch jemand eine Antwort auf meine andere Frage?
-
ups sorry Martin habe deine Nachricht übersehen
-
Aber warum so kompliziert?
Weil es halt so im Buch stand. Ok werde deine Lösung versuchen. Danke
-
y-vonne schrieb:
Aber warum so kompliziert?
Weil es halt so im Buch stand. Ok werde deine Lösung versuchen. Danke
Welches Buch hast du denn da?
-
So Andy nun aber genau lesen was ich schreibe.
Programming Windows wit MFC Second Edition Jeff Prosise.
Kann natürlich auch daran liegen dass ich das Beispiel auch nicht ganz gelesen habe sondern einfach das Beispiel genommen habe und daraus auch nur einen Teil.
-
y-vonne schrieb:
So Andy nun aber genau lesen was ich schreibe.
Programming Windows wit MFC Second Edition Jeff Prosise.
Kann natürlich auch daran liegen dass ich das Beispiel auch nicht ganz gelesen habe sondern einfach das Beispiel genommen habe und daraus auch nur einen Teil.
Hey, machst du dich lustig über mich? Ich habs dieses Mal genau gelesen und sogar gesehen, dass beim with das h fehlt (nur mal so am Rande).
Sicher wirds daran liegen, dass du das nicht ausreichend tiefgründig studiert hast, denn meist (nicht immer) funktionieren die Beispiele in den Büchern schon.
-
Sicher wirds daran liegen, dass du das nicht ausreichend tiefgründig studiert hast
Hehe genau daran liegts meistens.
-
Noch ne andere Frage dazu. Wie übergebe ich denn eine Callback an meinen Dialog die nicht statisch ist! Muss ja die Membervariable löschen können!
-
y-vonne schrieb:
Noch ne andere Frage dazu. Wie übergebe ich denn eine Callback an meinen Dialog die nicht statisch ist! Muss ja die Membervariable löschen können!
Übergib einen Zeiger auf Deine Klasse.
Oder verwende einen Interface auf Deine Klasse. Deine Klasse die den Callback erhalten soll leitest Du von der Interfaceklasse ab und übergibst dem Dialog nur das Interface.Dann hast Du in der Interfcae Klasse sogar x-Callbacks