2009-07-22 9 views
8

Ich habe einen MFC-Dialog, in dem zwei Optionsfelder vorhanden sind. Ich habe sie in eine nette Gruppe gestellt, ihre IDCs sind nacheinander (RB_LEFT, RB_RIGHT).MFC-Optionsfelder - Verhalten von DDX_Radio und DDX_Control

möchte ich DDX_Radio verwenden, so kann auf die Schaltflächen zugreifen einen ganzzahligen Wert so in der Funktion unter Verwendung DoDataExchange Ich rufe:

DDX_Radio(pDX, RB_LEFT, mRBLeftRight); 

wo mRBLeftRight eine Variable vom Typ Integer Mitglied ist. Ich brauche auch die Schaltflächen Eigenschaften zu bearbeiten, damit ich ein DDX_Control kartieren sie auf Membervariablen mRBLeft und mRBRight (CButton) verwenden wollte:

DDX_Control(pDX, RB_LEFT, mRBLeft); 
    DDX_Control(pDX, RB_RIGHT, mRBRight); 

jetzt, wenn ich den Anruf zu DDX_Control tun, wann immer DoDataExchange genannt wird, die Anwendung stürzt ab, weil DDX_Control zwingt RB_LEFT, um eine Nachricht zu behandeln, die DDX_Radio nicht verarbeiten kann. Dieser Teil verstehe ich.

Ich entschied mich, nicht DDX_Control zu verwenden (entfernte die Aufrufe in DoDataExchange) und nur einen Zeiger auf meine Optionsfelder (CButton *) in meinen Klassen. Also in meiner Funktion OnInitDialog, mache ich die folgenden Aufrufe:

mRBLeft= ((CButton*)GetDlgItem(RB_LEFT)); 
    mRBRight = ((CButton*)GetDlgItem(RB_RIGHT)); 

Nun, solange ich nicht mRBLeft verwenden Sie es in Ordnung sein wird, aber wenn ich es tue, bam, Absturz auf DoDataExchange. Die Sache, die mich wirklich verwirrt, ist, wenn ich meine linke Radio-Taste mit ((CButton*)GetDlgItem(RB_LEFT)->SetCheck(true) ändern wird es funktionieren. Sooo, was ist der Unterschied?

(ich weiß, dass es für wenig eine Menge Ärger, aber ich verstehen möchte nur die Mechanik)

+0

Ich habe irgendwo gelesen, dass ich nicht einen von GetDlgItem zurückgegebenen Zeiger speichern sollte, was wahrscheinlich richtig ist, vielleicht ist das die Ursache meines Problems? – levesque

Antwort

7

TBH Es ist sogar einfacher als JC's Post führt Sie zu glauben.

DDX_Control(pDX, IDC_RADIO3, m_r3); 
DDX_Control(pDX, IDC_RADIO4, m_r4); 

m_Val = 0; 
DDX_Radio(pDX, IDC_RADIO3, m_Val); 

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

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.

+0

Ich habe den ersten Radiobutton mit 'WS_GROUP' markiert ... – levesque

+0

Ich habe genau das gemacht .. glaub mir, es stürzt ab, wenn du den m_r3 verwendest. – levesque

+2

Seltsam ... eine Phrase zu prägen, "arbeitet an meiner Maschine" ... – Goz

1

Es ist ein Fehler in Ihren Räumlichkeiten. Sie können DDX_Radio und DDX_Control für die gleiche Kontrolle verwenden, wäre es sonst ziemlich nutzlos. Können Sie dies näher erläutern

"jetzt, wenn ich den Aufruf von DDX_Control, DoDataExchange aufgerufen wird, stürzt die Anwendung ab, da DDX_Control RB_LEFT erzwingt, eine Nachricht zu behandeln, die DDX_Radio nicht verarbeiten kann. Diesen Teil verstehe ich."

weil ich denke, dass dies bereits ein Symptom des zugrunde liegenden Problems ist.

+0

Ich fand die Antwort, wenn Sie sich interessieren :) – levesque

3

fand ich die Antwort hier: http://www.flounder.com/getdlgitem.htm

Es gibt ein Problem mit DDX_Control und DDX_Radio zugleich mit :) Dies ist ein kleiner Hack, um das Problem zu bekommen.

Radiobutton Variablen

Ein weiteres intrinsische Problem, das irgendeine Art von seltsamen philosophischen Sicht der Microsoft darstellt, ist, dass Sie nicht zu erlaubt werden müssen Steuergrößen für Radio Schaltflächen erstellen. Das macht keinen Sinn. Sie haben einige seltsame Idee, dass die einzige Möglichkeit, Sie Radio-Buttons manipulieren wird über einen Index ist. Dies ist hoffnungslos unzureichend.Daher müssen Sie gehen durch einige schwerwiegende Verrenkungen zu bekommen Steuervariablen für Ihre Radio Schaltflächen.

Das erste, was Sie tun müssen, ist zurück zu gehen und alle Radiobuttons als mit dem WS_GROUP Stil markieren. Nur Optionsfelder mit einer WS_GROUP Art können eine Steuervariable haben. Allerdings wenn Sie alle von ihnen mit WS_GROUP, erstellen die Steuer Variablen markieren, und entfernen Sie die WS_GROUP Attribut, alles funktioniert ganz gut, danke. Warum müssen wir gehen durch diese zusätzlichen Schritte macht keine Sinn was auch immer, aber wie die abgeleiteten Klassen Problem, ich beschwere mich über seit Jahren ohne Wirkung. Mein Problem ist, dass ich vergesse immer wieder zurück zu gehen und lösen Sie die alle WS_GROUP Attribute, so das erste Mal, dass ich laufen das Programm danach finde ich, dass alle meine Radio-Buttons Einknopf Gruppen sind. Hoppla. $ #%! Fix, und neu kompilieren/neu verknüpfen.

+1

Hmm ich bekomme es immer noch nicht, das hat immer wie erwartet für mich funktioniert. Wie unten erwähnt, müssen Sie den Stil des ersten Steuerelements auf WS_GROUP festlegen und dann funktioniert es einfach. Ah, wenigstens hast du dein Problem gelöst. – Roel

+1

FYI, ich bin gerade auf diese Frage gestoßen und dachte, ich würde Sie wissen lassen, ich habe dieses Problem nicht, und der Standard-Rat von Goz ist, was ich benutze. Es könnte ein tieferes Problem für Sie bedeuten. –

+0

@Mark, durch einen merkwürdigen Zufall bin ich heute darüber gestolpert. Diese Antwort ist ein schlechter Rat, sie stellt ein Missverständnis der Funktionsweise von DDX_Radio dar. Sie öffnen sich für eine Menge Kummer, wenn Sie im Gegensatz zu dem stehen, was Microsoft erwartet. Es gab ein anderes zugrunde liegendes Problem im Code, das nie diagnostiziert wurde, und mit einem Workaround wird es nie funktionieren. –