[Radio Buttons] BN_CLICKED für jeden Button
-
Ich habe ca. 10 Radiobuttons und mit jedem BN_CLICKED auf eins dieser Buttons ändert sich der Eintrag eines Edit-Feldes. Gibt es eine andere Lösung, als für jeden einzelnen Button das BN_CLICKED-Ereignis abzufangen und in der OnBn1(), OnBn2 .. OnBn10() - Methoden das Edit-Feld zu ändern?
Danke,
don_basto.
-
Jein, ich habe eine Idee, aber grade keine Möglichkeit die vorher zu testen.
Du erstellst die OnBn1 bis OnBn10. Dann nimmst du in der MessageMap bei den Funktionsnamen die Zahlen weg.
Im Header löschst du 9 Funktionen und nimmst der der letzten die Zahl weg.
Im Cpp auch.Dann musst du noch eine Wertevariable für die Radiobuttons erstellen und kannst dann in der OnBn anhand einer switch entscheiden, welchen Inhalt das Edit bekommen soll.
Okay?
-
Wenn die Buttons eine laufende Nummer in ihrer ID haben, kannst du mit COMMAND_RANGE die Aktionen der Buttons Abfangen und in einer Funktion abarbeiten.
BEGIN_MESSAGE_MAP(CTestDlg, CDialog) ON_COMMAND_RANGE(IDC_BUTTON1,IDC_BUTTON4, OnButtonChange) ... END_MESSAGE_MAP()
Und über die übergebene ID kannst du für jeden Button eine Aktion realisieren.
void CTestDlg::OnButtonChange(UINT nID) { switch(nID) { case IDC_BUTTON1: ... } }
-
Ich dachte, das geht nur bei Menüs und Toolbars...
-
Ich habe es jetzt nicht mit RadioButtons getestet. Aber mit CButtons hat es
funktioniert. Es kommt auf einen Versuch an.
-
Dann möchte ich gerne wissen, wie der Versuch ausgegangen ist.
Ein Radiobutton ist ja auch blos eine Sonderart eines CButton.
-
Danke für die Anregungen. Ich hab die erste (gemeinsame Methode für alle BN_CLCIKED-Ereignisse mit Member-Variable) ausprobiert und funzt super.
Der zweite Weg gefällt mir auch, allerdings sind meine Buttons nicht durchnummeriert. Damit fällt dieser Ansatz weg.
Danke für die Hilfe.Grüsse,
don_basto
-
don_basto schrieb:
Der zweite Weg gefällt mir auch, allerdings sind meine Buttons nicht durchnummeriert. Damit fällt dieser Ansatz weg.
Du kannst die Nummern direkt in der Resource.h ändern. Achte nur darauf, dass keine doppelt ist.
-
Hab nun doch mal den zweiten Vorschlag kurz getestet. Funzt auch auf den ersten Blick
und gefällt mir persönlich besser, weil man die case-Anweisung mit den IDs besser lesen. Ausserdem ist die MessageMap schön kurz (1 Eintrag statt 10).
Würde mich ja mal interessieren, wie die "range" zustande kommt?
Kann in meinem Fall nicht über die ID-Namen sein, sollte also über den UINT nID laufen, die man übergeben bekommt. Da liegen bei mir die Editboxen zwischen den Buttons. Sie reagieren aber nicht auf ON_COMMAND_RANGE.Grüsse,
don_basto
-
Vielleicht geht das nur für CButtons?
-
Das verstehe ich jetzt nicht ganz. Den ID-Namen sind ja nur Platzhalter für
Zahlenwerte. Mit der Range legst du den "Zahlenbereich" fest, für den die
Aktion gilt. Die Nummerierung der ID-Namen ist nicht von Bedeutung.
Was meinst du jetzt mit: Da liegen noch Editfelder dazwischen?
-
Ich meine damit, dass zwischen meinen Button-IDs (1004 bis 1025) noch die IDs von anderen Steuerelementen liegen. Diese Elemente sind im meinem Fall Editboxen. Allerding reagieren sie nich auf ON_COMMAND_RANGE, obwohl sie im angegebenen Bereich liegen.
Besser ausgedrückt?