MFC-Optionsfelder - Verhalten von DDX_Radio und DDX_Control

8

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:

%Vor%

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):

abzubilden %Vor%

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:

%Vor%

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)

    
levesque 22.07.2009, 14:21
quelle

3 Antworten

7

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.

    
Goz 22.07.2009, 14:59
quelle
3

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 einem WS_GROUP Stil   kann eine Kontrollvariable haben. Jedoch,   wenn Sie alle mit markieren    WS_GROUP , erstelle das Steuerelement   Variablen und entfernen Sie dann die    WS_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 alle WS_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.

    
levesque 22.07.2009 14:55
quelle
1

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.

    
Roel 22.07.2009 14:47
quelle

Tags und Links