Verarbeitung der Nachrichten in der Message Map funzt nicht
-
Um nochmal eins klar zustellen ( vielleicht habe ich mich nicht ganz klar ausgedrückt ). Ich habe nur einen Dialog ( das Hauptfenster ). Bei der Klasse CLDT_DataExchange_DlG(welche von CDialog abgeleitet ist ) habe ich keinen modalen Dialog zusätzlich erstellt. Ich versuche nur mit einem Dialog ( dem Dialog, den der Wizard automatisch generiert hat ) zu arbeiten. Kann es sein, das es so nicht funktioniert, wie ich es vorhabe ?
-
du musst die Nachricht doch auch noch in deiner Headerdatei hinzufügen/bekanntmachen.
Ich glaube das muss so heissen:afx_msg void OnKlickedButton(); //nicht bloss OnKlickedButton()
Hoffe das funzt.
-
Moin Paul,
In der Headerdatei habe ich sie auch deklaruert, allerdings ohne dem Prefix "afx_msg" .
Nun ja, ich habe es hinbekommen, das er in die Methode OnKlicked Button rein geht.
Die Nachrichten des Hauptfensters werden in Implementierungsdatei von "AutoprojectDlg.cpp" verarbeitet, dort wird ja auch der Dialog erstellt.In die Nachrichtentabelle habe ich dann einfach folgendes eingetragen :
[cpp] BEGIN_MESSAGE_MAP(CAutoProjectDlg, CDialog) ON_WM_SYSCOMMAND() ON_WM_CLOSE() ON_WM_PAINT() ON_WM_QUERYDRAGICON() //}}AFX_MSG_MAP ON_BN_CLICKED(IDC_LDT_DATAEXCHANGE_NEXT,CLDT_DataExchange_Dlg::OnBNClicked) END_MESSAGE_MAP() [/cpp]
Na ja, eigentlich wollte ich,das die Nachrichten in der eigenen Klasse verarbeitet werden, die ich geschrieben habe. Das scheint wohl nicht zu funktionieren.
Nochmal vielen Dank für die Hilfe und Tipps.
Bodo
-
Das muss aber auch in der eigenen Klasse gehen. Was sagt denn der Compiler, wenn du afx_msg hinzugefügt hast?
-
Das Programm wird ohne Fehler und Warnungen übersetzt, jedoch werden die Nachrichten in der eigenen Klasse nicht bearbeitet. (Ich kann auf den Buton drücken und drücken - es passiert einfach nichts )Er geht geht gar nicht in die Methode OnBNClicked ( hab die Methode von OnKlicked Button in OnBNClicked umbenannt ). Die Verarbeitung klappt nur wenn ich folgendes schreibe :
[cpp] BEGIN_MESSAGE_MAP(CAutoProjectDlg, CDialog) ON_WM_SYSCOMMAND() ON_WM_CLOSE() ON_WM_PAINT() ON_WM_QUERYDRAGICON() //}}AFX_MSG_MAP ON_BN_CLICKED(IDC_LDT_DATAEXCHANGE_NEXT,CLDT_DataExchange_Dlg::OnBNClicked) END_MESSAGE_MAP() [/cpp]
Gruss Bodo
-
Paul_C. schrieb:
Das muss aber auch in der eigenen Klasse gehen. Was sagt denn der Compiler, wenn du afx_msg hinzugefügt hast?
afx_msg ist folgendes
#define afx_msg
Das ist ein "Leer-Define" und soll in der Klasse nur optisch verdeutlichen, dass diese Methode eine Nachricht verarbeitet.
Wenn die Methode nicht ausgeführt wird, dann liegst daran, dass sie nicht an die Klasse weitergeleitet wird.
Du kannst mal zu Testzwecken schauen, ob die in der PreTranslateMessage durchgeht.
-
*ups*. Wie peinlich. Dachte immer, das muss dahin, ohne nachzuschauen, was es genau ist. Werde mich bessern, versprochen. *ganzrotimsandeversink*
-
*hehe* Visual Assistent rulez, *gg* Maus drüber halten und du siehst was hinter dem #define steht^^
-
Jaja, ist ja schon gut. Ganz so doof bin ich nicht. :p
MfG,
Paul.
-
Pellaeon schrieb:
Paul_C. schrieb:
Das muss aber auch in der eigenen Klasse gehen. Was sagt denn der Compiler, wenn du afx_msg hinzugefügt hast?
afx_msg ist folgendes
#define afx_msg
Das ist ein "Leer-Define" und soll in der Klasse nur optisch verdeutlichen, dass diese Methode eine Nachricht verarbeitet.
Wenn die Methode nicht ausgeführt wird, dann liegst daran, dass sie nicht an die Klasse weitergeleitet wird.
Du kannst mal zu Testzwecken schauen, ob die in der PreTranslateMessage durchgeht.Japp, wie es scheint, werden die Nachrichten nicht an die Klasse weitergeleitet sondern von der Nachrichtenqueue von AutoprojectDlg behandelt. Ich weiss auch nicht, wie ich testen kann, ob sie die PreTranslateMessage durchgeht. Wie muss ich es machen, das die eigene geschriebene Klasse die Nachrichtenbehandlung für das Hauptfenster übernimmt ? Vielleicht stell ich mich einfach zu blööd an ( was ich natürlich nicht hoffe bzw glaube ).Könntest du es büdde einwenig erläutern ?
Gruss Bodo
-
Die PreTranslateMessage-Methode ist einfach dazu da, alle Nachrichten, welche die Klasse erhält, durchgehen zu können, bevor die Nachrichten dann "weiter verarbietet" werden. Die Methode überschreibt man sonst aber auch mit dem KLassenassistenten.
Ich versteh noch nicht ganz, was du mit dem Dialog anfangen willst?
Kannst dir ja auch noch einen DIalog mit dem Assistenten anlegen und testen, ob mit dem das dann funzt, was du dir vorstellst.
-
Wie gesagt, ich versuche nur mit einem Dialog zu arbeiten, dem Hauptdialog.
Abschnitt 1 :
Am Anfang muss der User den Datenaustauschformat vornehme ( Befundübermittlung Arzt => Laborfacharzt). Dieser erste Abschnitt wird durch die Klasse CLDT_Dataexchange_Dlg vorgenommen. Diese Klasse ist verantwortlich für den jeweiligen Datenaustauschformat. ( Das sind 6 Radiobuttons und ein einfach Pushbutton ).Abschnitt 2:
Im nächsten Abschnitt muss eine Excel Datei eingelesen und noch eine weitere Datei eingelesem werden. Dazu muss der User in einem Editfeld den Pfad zur Excel Datei eingeben und auch den Pfad zur anderen Datei. Die Radiobuttons sind dann nicht mehr zu sehen, nur über einen Zurück Button kann er die Wahl wieder ändern. Außerdem soll es dann einen Weiter Button geben um zum nächsten Abschnitt zu kommen:
Abschnitt 3:
Dort ist kann er dann wählen, wie die Daten übertragen werden sollen. Als Option steht Export auf Diskette bzw Übertragung via DFÜ.Vom Abschnitt 1 gibt es einen Button, der zum Abschnitt 2 führt, bei Abschnitt2 gibt es zwei Buttons, der eine dient um zum ersten Abschnitt wieder zurück zukommen, der andere fürt zum Abschnitt 3
Ich stelle es mir so vor, wie eine Art Installer, wo ich auch Vor und Zurück Buttons habe. Und dieses wollte ich nur mit dem Hauptdialog realisieren, für jeden einzelen Abschnitt wollte ich ne eine klasse realisieren die das Erzeugen der Steuerelemente übernimmtt sowie die Nachrichtenbehandlung der einzelen Steuerelemente.
-
Wenn du nur mit einem Dialog arbeitest dann hast du auch nur eine Dialog und dieser hat eben auch seine Klasse.
Das du in einer anderen Steuerlemente erstellst hat damit nichts zu tun. Sie werden eben auf den Dialog gezeichnet.
Wenn du es so machen willst wie du musst du Dialoge erstellen die als Child in einen Hauptdialog kommen.