Nachricht an Button senden
-
Hallo,
ich möchte eine WM_COMMAND Nachricht an meinen Button senden, um ihn automatisch betätigen zu lassen.
DWORD wParam=BN_CLICKED; wParam=wParam << 16; wParam+=IDC_BUTTON5; //SendMessage(HANDLE_DES_BUTTONS,WM_COMMAND,wParam,0);
Die Frage ist jetzt wie ich an das Handle des Buttons komme.
Habe es mit GetDlgItem versucht,weiss aber nicht was ich den ersten Parameter übergeben soll.Weiss jemand Hilfe?
Für Antworten bin ich sehr dankbar.
mfg
sleeping sun
-
Ich nehme mal an, dass IDC_BUTTON5 die ID des Buttons ist und dass der Button in einem von CWnd abgeleiteten Element ( z.B. CDialog ) sitzt.
Dann erhälst du mit der Memberfunktion CWnd::GetDlgItem( int nID ) das CWnd - Objekt des Buttons. Mit diesem Object kannst du SendMessage aufrufen.Beispiel:
void CDialog::SendeNachrichtAnButton() { CWnd* button = GetDlgItem( IDC_BUTTON5 ); button->SendMessage( BM_CLICK, 0, 0 ); }
Allerdings solltest du wissen, dass es nichts bringt, wenn du die WM_COMMAND-Nachricht an den Button sendest, da normalerweise der Button die Nachricht an das Parent-Element sendet.
Um einen Klick zu simulieren, gibts folgende Message:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wceshellui5/html/wce50lrfBMCLICK.asp
-
Thx.
Bei mir kommt immer die Fehlermeldung:
error C2660: 'GetDlgItem' : Funktion akzeptiert keine 1 Parameter
Fehler beim Ausführen von cl.exe.1 Fehler, 0 Warnung(en)
Der zweite Parameter ist das Handle, das ich nicht weiss...
-
Die Funktion erwartet das Handle des Fensters in dem der Button sitzt ( Parent-Fenster ). Du rufst wahrscheinlich nicht die Memberfunktion von CWnd auf sondern die API-Funktion direkt.
Die API-Funktion erwartet als erstes Handle das Parent-Element ( Dialog ) des Buttons, als zweiten die ID des Buttons.
Du kannst aber auch die Memberfunktion des Buttons aufrufen, die erwartet dann nur einen Parameter.void func() { // Parentelement des Buttons nehme ich als Dialog ( pDialog ) an. HWND hWndButton = ::GetDlgItem( pDialog->m_hWnd, IDC_BUTTON5 ); ::SendMessage( hWndButton, BM_CLICK, 0, 0 ); // Ist fast) das selbe wie oben und entspricht mehr dem MFC-Stil CWnd* pWndButton = pDialog->GetDlgItem( IDC_BUTTON5 ); pWndButton->SendMessage( BM_CLICK, 0, 0 ); }
-
Danke für die Hilfe aber es funktioniert leider immer noch nicht.
Wie komm ich an das Parentfenster meines Buttons?
Das Fenster wo mein Button sitzt ist ein Dialogfenster (Ressourcen-ID: IDD_PLAYER_DIALOG, Klasse CPlayerDlg)HWND hWndButton = ::GetDlgItem( CPlayerDlg->m_hWnd, IDC_BUTTON5 ); ::SendMessage( hWndButton, BM_CLICK, 0, 0 );
Fehlermeldung:
##Der Typ 'CPlayerDlg' hat keinen ueberladenen Elementoperator '->Das Problem ist, das ich den Code in einer eigenen globalen Funktion aufrufen muss, die in meiner CPlayerDlg.cpp steht. Diese Funktion ist eine Zeitschleife die alle paar Sekunden z.B. meinen Button drücken soll.
Ich könnte das Problem auch anders lösen, wenn ich in dieser Funktion auf die member variablen meiner buttons und editfelder zugreifen könnte.
Dann würde ich in meiner Schleife halt den Code ausführen der in der Button Funktion steht, anstatt den Buttondruck zu simulieren.Leider muss der Code der ausgeführt werden soll in einer Funktion stehen und lokale funktiondefinitionen sind leider verboten.
-
Du solltest an deinem Design arbeiten und nicht einen Hack einbauen.
Buttonklick führt immer nur eine Funktion aus.Suche eine Möglichkeit die Funktion aufzurufen und nicht den Button anzuklicken.
Du kannst sowieso nur ein Nachricht senden die der Button auch senden würde.Dies ist aber unschön.