Nachrichten selber verschicken? ...
-
Hallo zusammen,
ich habe einen nun einen Dialog mit ein paar Buttons geschrieben und das funktioniert auch alles recht fein. Nun würde ich jedoch gerne das die einzige Applikation:
// Die einzige Applikation CMainApp oApp;auf das Klicken eines Buttons reagiert. Erschwerend kommt noch hinzu, dass der Button auf den geklickt wurde, am besten selber diese Nachricht an die Applikation verschickt. Kann man selber Nachrichten verschicken und dann mit
BOOL CMainApp::PreTranslateMessage(MSG* pMsg)auf diese reagiere bzw. diese Nachricht "abfange". Ansonten bin ich auch gerne für andere Vorschläge offen :).
Danke im vorraus
Jogilein
-
Warum Nachricht an das CWinApp Objekt versenden? Das hat doch kein Fenster und kann entsprechende nur Thread Nachrichten bekommen!
Warum nicht gleich die Methode aus CWinApp aufrufen. Ein SendMessage ist auch nichts anderes als ein Methodenaufruf, sofern das Fenster im gleichen Threadkontext liegt.
-
Warum nicht gleich die Methode aus CWinApp aufrufen.
Also wie kann ich den beim CWinApp direkt die Methode aufrufen? Wie bekomm ich den Buttonklick den mit beim CWinApp...
-
Wenn du eine MFC-Applikation hast, kannst du für (fast) alles Message-Maps anlegen, die die Nachrichten an die passenden Methoden weiterleiten. (und bei einem vernünftigen Programm sorgt Visual Studio auch selber dafür, daß du Button-Klicks und ähnliches bemerkst)
-
Wobei man einschränken muss, dass Klassen die keine Windows sind und nur von CCmdTarget angeleitet sind nur Handler für WM_COMMAND Nachrichten behandeln können!
-
Wahrscheinlich bin ich etwas zu unerfahren oder zu dumm um diese Hinweise zu verstehen...
Also das ein CWinApp Objekt nur die WM_COMMAND-Nachrichten erhält bzw. nur das mappen "zuläßt" habe ich bereits bemerkt (glaube ich!).
Mein CDialog-Objekt bekommt auch über ON_CONTROL_RANGE(BN_CLICKED, 1, 1, OnButtonClick) die Clicks mit... aber ich würde jetzt eben gerne die CWinApp auf solch einen Klick reagieren lassen.
Wenn ich dort aber nun
BEGIN_MESSAGE_MAP(CMainApp, CWinApp) ON_CONTROL_RANGE(BN_CLICKED, 1, 1, OnButtonClick) END_MESSAGE_MAP()Reinschreibe klappt es leider nicht... also die OnButtonClick-Methode wird gar nicht aufgerufen (siehe oben => nur WM_COMMAND Nachrichten).
Besteht denn keine andere Möglichkeit das ich wenn ich beim CDialog oder CButton die Nachricht "Click" erhalte das ich dies dem CWinApp-Objekt mitteile, indem ich selber eine Nachricht verschicke... oder würde das mit der AfxGetApp gehen, dass ich dann dort eine Methode aufrufe...

Danke für Antworten
Jogilein
-
Ich halte gar nichts von Deiner Idee. Bist Du Dir ganz sicher das Du das möchtest?
Du bekommst hier schon mal Probleme, weil Deine IDs IDC_ sind und keine ID_, d.h. in einem anderen Bereich liegen.Wen Du das wirklich willst (und ich rate Dir nochmal davon ab), dann kannst Du CDialog::OnCmdMsg überschreiben und AfxGetApp()->OnCmdMsg aufrufen, wenn kein Handler im eigenen Dialog gefunden wurde.
-
Ich halte gar nichts von Deiner Idee. Bist Du Dir ganz sicher das Du das möchtest?
Von der Idee das das CWinApp Objekt bzw. mein CMainApp Objekt über die Aktion informiert wird... ja bin ich... ich möchte jegliche Interaktion direkt dort verarbeiten und von dort die entsprechenden Funktionen ausführen...
Was ist so schlecht an der Idee? Ich habe jetzt folgendes gebastelt
afx_msg void CMainButton::OnLButtonUp(UINT nFlags, CPoint point) { // Zuerst CButton diese Nachricht abarbeiten lassen CButton::OnLButtonUp(nFlags, point); // Selber auf Nachricht reagieren if (m_bMouseDown) { CMainApp* oApp = (CMainApp*) ::AfxGetApp(); // Nachricht verarbeiten oApp->NotifyInteraction(); } // erst jetzt setzen, da sonst die Buttonfarbe nicht stimmt m_bMouseDown = FALSE; }Die Methode NotifyInteraction soll jetzt noch ein paar Parameter erhalten, damit ich dann in der oApp darauf reagieren kann und die entsprechende (dem Button entsprechende) Funktion ausführe... z.B: hab ich mir überlegt hat der Button noch eine Membervariable CString m_FunctionName in der die entsprechende Funktion steht...
Über eure Meinung bin ich gespannt...

Jogilein