Benutzerdefinierte Nachrichten
-
Hi,
kann mir jemand eine Tutorial / Beispiel nennen in dem die Funktionsweise von benutzerdefinierten Nachrichten erkärt wird. Ich möchte von einem Dialogfenster eine Nachricht an ein zweites senden. Dieses soll sich dann schliessen.Bisher habe ich die Funktionen Send- / PostMessage gefunden, allerdings nichts wie ich diese für meine Zwecke verwenden kann.
Mfg.
Martin
-
Du brauchst einen Zeiger auf den Empfänger.
-
Vieleicht sollte ich genauer beschreiben was ich machen will. Ich habe mehrere Dialogfenster, wobei das eine sofort angezeigt wird. Innerhalb dieses Dialogfensters befindet sich ein TabControll in dem die anderen Dialoge angezeigt werden.
Das schliessen des Hauptdialogs per ESC funktioniert jetzt allerdings nur wenn sich der Focus auserhab des Tab-Controlls befindet.
Wenn ich innerhalb eines Tabs die ESC-Taste drücke wird dieser Dialog geschlossen und der Entsprechende Tab hat keinen Inhalt mehr.
Ich habe daher in den Dialogen innerhalb des TabControll-Elements die ESC Taste per PreTranslateMessage abgefangen und möchte nun eine Nachricht an das Hauptfenster senden sobald die ESC-Taste innerhalb des TabControll-Steuerelemts gedrückt wird
-
Der Konstruktor von so einem Dialog sieht ja so aus:
CDeinDlg(CWnd* pParent = NULL); // Standardkonstruktor
Ich vermute mal, dass du die Dialoge vom zu schließenden Dialog aus aufrufst. Gib denen einfach this mit.
-
OK ich habs nochmal so versucht:
Im Dialogfenster das innerhalb des Tabs angezeigt wird sieht die PreTranslateMessage wie folgt aus, wobei main den Zeiger auf den Hauptdialog darstellt:BOOL CTab1::PreTranslateMessage(MSG* pMsg) { if (pMsg->wParam == VK_ESCAPE){ main->PostMessage(WM_CHAR, 'E'); return 1; } return CDialog::PreTranslateMessage(pMsg); }
Im Hauptfenster will ich die Nachricht empfangen und zwar so:
BOOL CTabMain::PreTranslateMessage(MSG* pMsg) { if(pMsg->message=='E'){ OnCancel(); } return CDialog::PreTranslateMessage(pMsg); }
Wo liegt mein Fehler?
Gruss
Martin
-
Ich glaube du solltest
if (pMsg->message == WM_CHAR) { if (pMsg->wParam == 'E') ....
schreiben.
-
Du interpretierst die eingehende Nachricht falsch. In pMsg->message steht die ID der Nachricht (für dich also WM_CHAR), in pMsg->wParam der übergebene Parameter ('E').
PS: main ist afaik ein reservierter Bezeichner.
-
Super, danke es funktioniert
-
versuch es mal damit
BOOL CTab1::PreTranslateMessage(MSG* pMsg) { if ((pMsg->message== WM_CHAR)&&(pMsg->wParam == VK_ESCAPE)){ AfxGetMainWnd()->PostMessage(pMsg->message, pMsg->wParam, pMsg->lParam); return 1; } return CDialog::PreTranslateMessage(pMsg); }
dann brauchst du die message im Maindialog nicht mehr abfangen