Mehrere Buttons sollen eine einzige OnClick Funktion ausführen
-
Hallo,
wie der Titel schon sagt habe ich mehrere Buttons. Diese Buttons sollen teilweise unterschiedliche Sachen machen, aber sich gleich verhalten. Wenn ich z.B. auf einen Eintrag in einem CListCtrl klicke soll der dazugehörige Button die Beschrifung "Bearbeiten" bekommen. Durch einen Klick auf Bearbeiten wird der Button zu einem Übernehmen Button. Bei klick auf übernehmen werden die Änderungen ins CListCtrl eingegtragen und verschiedene Elemente auf meinem Dialogfeld aktiviert oder deaktiviert.
Soviel zu der allgemeinen Beschreibung. Nun zu meinem Problem. Ich müsste ja für jeden Button eine eigene OnClick Funktion erstellen lassen und dort den entsprechenden Code für das gewünschte Verhalten reinkopieren.
Gibt es vieleicht eine Möglichkeit alle Buttons auf eine einzige OnClick-Anweisung zu "verlinken" und in dieser OnClick-Anweisung auch noch herauszufinden auf welchen Button eigentlich gedrückt wurde? ID, Handle ... irgendwas was sie eindeutig identifiziert. (So bräuchte ich nämlich nur noch eine Switch-Anweisung die je nach gedrückten Button etwas anderes ausführt)Wie dieses verlinken geht weis ich ja schon. Mann muss nur in der entsprechenden Klasse folgende Zeilen editieren[cpp]
ON_BN_CLICKED(IDC_btn_BearbeitenSonderspalten, Onbtn_BearbeitenSonderspalten) //Die Fettgedruckte Funktion muss ausgetauscht werden[/cpp]
Aber wie kann man jetzt den Button eindeutig Identifizieren? vieleicht einen "Handle auf den Button von dem Button an die Funktion übergeben"?Ich habs schon mit dem this Befehl probiert, aber das liefert ja den Handle auf die Klasse des Dialogfeldes zurück (oder so ähnlich), naja und in der FAQ hab ich leider auch nichts gefunden.
[EDIT]Auf die gleiche Art und Weise will ich auch mehrere SetFocus() -Anweisungen zu einer kombinieren um die entsprechenden Buttons zu deaktivieren falls irgendwas anderes Ausgewählt wird. Sonst schreibt man sich ja zu tode... [/EDIT]
-
Mach doch eine Funktion, der du die Buttonid gibst.
Dann machst du für jeden Button eine Handlerfunktion und gibst die ID weiter.
-
estartu_de schrieb:
Mach doch eine Funktion, der du die Buttonid gibst.
Dann machst du für jeden Button eine Handlerfunktion und gibst die ID weiter.
wie sieht so eine Handlerfunktion aus? In dem Fall müsste ich doch auch mehrere "verschiedene" BN_CLICKED Funktionen machen?
-
Ja, du musst für jeden Button eine BN_CLICKED machen.
Und in die schreibst du z.b. sowas:
Buttonfunktion(IDC_BTN_ROT);
Oder was auch immer, liefer mir Namen, wenn du es angepasst haben magst.
-
Es soll am Ende in etwa so aussehen:
//{{AFX_MSG_MAP(CR6S_Disziplinen_Horizontal) ON_BN_CLICKED(IDC_btn_BearbeitenAnzahlSpalten, Onbtn_AllgemeinClick) ON_BN_CLICKED(IDC_btn_Bearbeiten_AnzahlZeilen, Onbtn_AllgemeinClick) ON_BN_CLICKED(IDC_btn_Abbrechen_AnzahlSpalten, Onbtn_AllgemeinClick) ON_EN_CHANGE(IDC_txt_AnzahlSpalten_Beschriftung, Ontxt_Change_AnzahlSpaltenBeschriftung) //}}AFX_MSG_MAP
eine Funktion für alle Click ereignisse.
Kann mir keiner helfen?
-
estartu_de schrieb:
Ja, du musst für jeden Button eine BN_CLICKED machen.
Und in die schreibst du z.b. sowas:
Buttonfunktion(IDC_BTN_ROT);
Oder was auch immer, liefer mir Namen, wenn du es angepasst haben magst.
Danke dir. Ich denke mal das es gar nicht anders gehen wird. Schade das der Code dadurch so unübersichtlich wird
-
Eine Idee habe ich noch:
Versuch mal, ob du mit GetFocus an den Button kommst. DANN kannst du auch eine Funktion nehmen.
Ich wüßte nicht, dass es CommandRanges für Buttons gibt, ich kenne das nur für Menüs.
-
estartu_de schrieb:
Eine Idee habe ich noch:
Versuch mal, ob du mit GetFocus an den Button kommst. DANN kannst du auch eine Funktion nehmen.
Ich wüßte nicht, dass es CommandRanges für Buttons gibt, ich kenne das nur für Menüs.Das hört sich gut an
Was sind denn CommandRanges
-
Die sind ein "Ersatz" von WM_COMMAND.
WM_COMMAND_RANGE <- schlag mal nach.
-
estartu_de schrieb:
Eine Idee habe ich noch:
Versuch mal, ob du mit GetFocus an den Button kommst. DANN kannst du auch eine Funktion nehmen.Ich habe das jetzt mal mit folgendem Code realisiert:
CButton *p_GedrueckterButton = (CButton*)GetFocus(); CString s_Beschriftung; p_GedrueckterButton->GetWindowText(s_Beschriftung); //s_Beschriftung enthält auch die Beschriftung des Buttons
und siehe da es Funktioniert. Mit GetDlgID gibt er auch die korrekte ID zurück. Aber ist das eigentlich sauber was ich da Programmiere?
Wie ich grad gesehen hab werden bestimmte ID-Nummern mehrfach vom Ressourceneditor vergeben. Gibt es denn da keine Konflikte?
-
Das ist schon ziemlich okay. Eine Feinheit könnte man noch machen (einen dynamic_cast statt einem C-Cast).
Mit den Zahlen musst du dir keine Sorgen machen. Ich hatte mit den automatischen Werten noch keine Probleme.
Manche Nummern werden auch nicht mehr benutzt. Guck mal unter Ansicht - Ressourcensymbole.