Ich habe einen MFC-Dialog, in dem es zwei Optionsfelder gibt. Ich habe sie in eine nette Gruppe gesetzt, ihre IDCs sind nacheinander ( RB_LEFT, RB_RIGHT
).
Ich möchte DDX_Radio
verwenden, damit ich mit einem Integer-Wert auf die Schaltflächen zugreifen kann, also rufe ich in der Funktion DoDataExchange auf:
Dabei ist mRBLeftRight eine Membervariable vom Integer-Typ. Ich muss auch die Eigenschaften der Schaltflächen bearbeiten, also wollte ich ein DDX_Control
verwenden, um sie auf die Membervariablen mRBLeft und mRBRight (CButton):
Wenn ich jetzt den Aufruf von DDX_Control
mache, stürzt die Anwendung bei jedem Aufruf von DoDataExchange ab, weil DDX_Control
erzwingt RB_LEFT
eine Nachricht verarbeitet, die DDX_Radio
nicht verarbeiten kann. Dieser Teil verstehe ich.
Ich entschied mich, DDX_Control
nicht zu verwenden (entfernte die Aufrufe in DoDataExchange) und behalte nur einen Zeiger auf meine Optionsfelder (CButton *) in meinen Klassen. Also mache ich in meiner OnInitDialog-Funktion die folgenden Aufrufe:
Nun, solange ich mRBLeft nicht benutze, wird es in Ordnung sein, aber wenn ich das tue, stoße auf DoDataExchange ab. Das Ding, das mich wirklich verwirrt, ist, wenn ich mein linkes Optionsfeld mit ändern %Code% es wird funktionieren. Sooo, was ist der Unterschied?
(Ich weiß, es ist eine Menge Ärger für wenig, aber ich will nur die Mechanik verstehen)
TBH Es ist sogar einfacher als JC's Beitrag Sie glauben lässt.
%Vor%Sie müssen das erste Optionsfeld in der Gruppe mit WS_GROUP markieren (in diesem Fall IDC_RADIO3). Sie sind jetzt gut zu gehen und es wird automatisch IDC_RADIO3) auswählen.
Um m_Val auf dem neuesten Stand zu halten, ist es wahrscheinlich sinnvoll, einen Klick-Handler auf alle Optionsfelder in der Gruppe zu setzen. Innerhalb dieser Funktion rufen Sie einfach UpdateData (TRUE) auf; m_Val zeigt nun auf den Index des Optionsfelds in der Gruppe.
Ich fand die Antwort hier: Ссылка
Es gibt ein Problem bei der Verwendung von DDX_Control
und DDX_Radio
zur gleichen Zeit :) Dies ist ein kleiner Hack, um das Problem zu umgehen.
Optionsfeldvariablen
Ein weiteres intrinsisches Problem, welches repräsentiert eine Art von seltsam philosophischer Standpunkt von Microsoft, ist, dass du es nicht dürfen darfst Erstellen Sie Kontrollvariablen für Radio Tasten. Das macht keinen Sinn. Sie habe eine seltsame Idee, dass der einzige Weg Du wirst jemals Radio-Buttons manipulieren ist über einen Index. Das ist hoffnungslos unzureichend. Deshalb musst du gehen durch einige ernste Verdrehungen zu Erhalten Sie Kontrollvariablen für Ihr Radio Knöpfe.
Das erste, was Sie tun müssen, ist zu gehen zurück und markieren Sie alle Optionsfelder als mit dem
WS_GROUP
Stil. Nur Optionsfelder mit einemWS_GROUP
Stil kann eine Kontrollvariable haben. Jedoch, wenn Sie alle mit markierenWS_GROUP
, erstelle das Steuerelement Variablen und entfernen Sie dann dieWS_GROUP
Attribut, alles funktioniert Ganz gut, danke. Warum müssen wir? gehen Sie durch diese zusätzlichen Schritte macht nein Sinn wie auch immer, aber wie die abgeleiteten Klassenproblem, ich habe mich beschwert darüber seit Jahren ohne Wirkung. Mein Problem ist, dass ich es immer wieder vergesse zurückgehen und alleWS_GROUP
rückgängig machen Attribute, also das erste Mal, dass ich renne Das Programm danach finde ich alles Meine Radio-Tasten sind eine Taste Gruppen. Hoppla. $ #%! Fix und neu kompilieren / neu verknüpfen.
In Ihren Räumlichkeiten ist ein Fehler aufgetreten. Sie können DDX_Radio und DDX_Control für dasselbe Steuerelement verwenden, ansonsten wäre es ziemlich nutzlos. Können Sie näher auf
eingehen?"Wenn ich jetzt DDX_Control aufruft, stürzt die Anwendung bei jedem Aufruf von DoDataExchange ab, weil DDX_Control RB_LEFT zwingt, eine Nachricht zu bearbeiten, die DDX_Radio nicht verarbeiten kann. Diesen Teil verstehe ich."
weil ich denke, dass dies bereits ein Symptom des zugrunde liegenden Problems ist.
Tags und Links c++ radio-button mfc