auf Menüklicks reagieren
-
Hallo
Ich habe zu einer dialogfeldbasierten Anwendung ein Menü hinzugefügt uns zwar so:
in BLM-EditorDlg.cpp:
CMenu Menu; Menu.LoadMenu(IDR_MENU1); SetMenu(&Menu);Nun würde ich natürlich auch gerne auch gerne auf Menüklicks regaieren, aber die jeweiligen Funktionen werden nur behandelt, wenn ich die Funktionen in die BLM-EditorDlg-Klasse packe. Ich würde aber gerne in einer anderen Klasse auf die Klicks reagieren. Wenn ich den Eventhandler aber in die andere Klasse packe, wird diese Funktion nie abgearbeitet. Wie kann ich das ändern?
Ich hoffe, dass ich mein Problem erläutern konnte.
chrische
-
Menuitems versenden WM_COMMAND Nachrichten. Dein FrameWnd muss in einer MFC Anwednung über ON_COMMAND Handler verfügen. Dass die Nachrichten versendet werden kannst Du mit Spy++ erkennen!
-
Hallo
Martin Richter schrieb:
Menuitems versenden WM_COMMAND Nachrichten. Dein FrameWnd muss in einer MFC Anwednung über ON_COMMAND Handler verfügen. Dass die Nachrichten versendet werden kannst Du mit Spy++ erkennen!
Ich will ganz ehrlich sein: Diese Antwort verstehe ich nicht. Kann ich den Eventhandler nun hinpacken, wo ich will oder nicht?
chrische
-
Wenn Du es nicht verstehst solltest Du Dich mit dem MFC Command Routing auseinandersetzen. Evtl. tut es da ein Tutorial...
Nein das kannst nicht den Command Handler irgendwo reinpacken. Die MFC routet WM_COMMAND Nachrichten die im FrameWindow ankommen an den aktiven View von dort an das Dokument von dort an das Frame von dort an die Applikation.
Wo immer der erste Handler gefunden wird, der bekommt die Nachricht. D.h. ein inaktiver View sieht nichts von dem WM_COMMAND, dito ist es mit einem Dialog irgendwo der nicht modal angezeigt ist...
-
ähm martin er hat ein dialogbasierende anwendung keine SDI oder MDI wo man eine MainFrame bzw. C..View hat.
Setz dir im Hauptdialog über den klassenassi den WM_COMMAND Nachrichtenhandler in diesem fängst du es wie folgt ab
in resource.h
#define IDC_SEND_MENUPUNKT 9999im Hauptdialog.cpp bei OnCommand(...)
switch(wParam) { case IDC_DEIN_MENU_PUNKT: CDeinDialog *pDlg = new CDeinDialog; pDlg->PostMessage (IDC_SEND_MENUPUNKT, 0,0); break; }eine möglichkeit innerhalb der case anweisung wäre du sendest eine PostMessage.
die Postmessage fängst du im anderen dialog wieder mit der PreTranslateMessage ab.
im AnderenDialog.cpp
BOOL CDeinDialog::PreTranslateMessage(MSG* pMsg) { // TODO: Speziellen Code hier einfügen und/oder Basisklasse aufrufen switch(pMsg->message) { case IDC_SEND_MENUPUNKT: break; } return CDialog::PreTranslateMessage(pMsg); }SendMessage würde auch gehn dafür hab ich aber im momment keine zeit ein beispiele zu schreiben