MFC boutons radio - DDX_Radio et DDX_Control comportement
J'ai une boîte de dialogue MFC dans lequel il y a deux boutons radio. J'ai mis dans un beau groupe, leur Cdi sont l'une après l'autre (RB_LEFT, RB_RIGHT
).
Je veux utiliser DDX_Radio
afin que je puisse accéder aux boutons à l'aide d'un entier de valeur dans la fonction DoDataExchange j'appelle :
DDX_Radio(pDX, RB_LEFT, mRBLeftRight);
où mRBLeftRight est une variable membre de type entier. J'ai aussi besoin de modifier les boutons des propriétés si je voulais utiliser une DDX_Control
à la carte sur des variables de membre mRBLeft et mRBRight (CButton):
DDX_Control(pDX, RB_LEFT, mRBLeft);
DDX_Control(pDX, RB_RIGHT, mRBRight);
maintenant, si je ne l'appel à DDX_Control
, chaque fois que DoDataExchange est appelée, l'application se bloque parce que DDX_Control
forces RB_LEFT
pour traiter un message qui DDX_Radio
ne peut pas gérer. Cette partie, je comprends.
J'ai décidé de ne pas utiliser DDX_Control
(plus d'appels dans DoDataExchange) et il suffit de garder un pointeur sur mes boutons radio (CButton*) dans mes classes. Donc, dans ma fonction OnInitDialog, je ne les appels suivants :
mRBLeft= ((CButton*)GetDlgItem(RB_LEFT));
mRBRight = ((CButton*)GetDlgItem(RB_RIGHT));
Maintenant, tant que je ne l'utilise pas mRBLeft ça va être bien, mais si je le fais, bam, crash sur DoDataExchange. La chose qui m'étonne vraiment, c'est si je change ma gauche bouton radio à l'aide de
((CButton*)GetDlgItem(RB_LEFT)->SetCheck(true)
il va travailler. Sooo quelle est la différence ?
(Je sais c'est beaucoup de tracas pour peu, mais je veux juste comprendre la mécanique)
OriginalL'auteur levesque | 2009-07-22
Vous devez vous connecter pour publier un commentaire.
TBH c'est encore plus facile que JC post vous mènent à croire.
Vous avez besoin pour marquer le PREMIER bouton radio dans le groupe avec WS_GROUP (Dans ce cas IDC_RADIO3). Désormais, vous êtes bon pour aller et il va automatiquement sélectionner IDC_RADIO3).
Maintenant pour garder m_Val jusqu'à ce jour, il vaut probablement la peine de mettre un gestionnaire de clic sur tous les boutons de la radio dans le groupe. À l'intérieur de cette fonction, tout simplement, appelez UpdateData( TRUE ); m_Val maintenant pointer vers l'index du bouton radio dans le groupe.
WS_GROUP
...J'ai fait exactement cela.. croyez-moi il va planter si vous utilisez le m_r3.
Étrange ... pour reprendre l'expression consacrée, "Travaille sur ma machine" ...
OriginalL'auteur Goz
J'ai trouvé la réponse ici : http://www.flounder.com/getdlgitem.htm
Il y a un problème avec l'utilisation de
DDX_Control
etDDX_Radio
en même temps 🙂 C'est un petit hack pour contourner le problème.Pour info, je viens de tomber sur cette question et j'aimerais vous le savez, je n'ai pas ce problème, et la norme des conseils de Goz est ce que j'utilise. Il peut indiquer un problème plus profond pour vous.
par une étrange coïncidence, je couru à travers cette aujourd'hui aussi. Cette réponse est de mauvais conseils, il représente une incompréhension du fonctionnement de DDX_Radio. Vous ouvrez-vous à beaucoup de chagrin quand vous allez à l'encontre de ce que Microsoft attend. Il y avait un autre problème sous-jacent dans le code qui n'a jamais été diagnostiqué, et avec une solution de contournement en place, il ne le sera jamais.
Les gars, vous êtes probablement raison. Je n'ai pas de temps pour étudier cette question, mais j'ai marqué goz réponse que le droit de réponse.
FWIW, l'ensemble de la citation de M. de nouveaux Arrivants ne concerne que les l'assistant classe MFC que, dans la version qu'il a utilisé à l'époque, apparemment, seuls autorisés à créer un CButton membre de contrôle pour la radio boutons marqués par WS_GROUP. L'ensemble de la citation n'a pas de sens si ne pas lire de cette façon.
OriginalL'auteur levesque
Il y a une erreur dans vos locaux. Vous peut utilisation DDX_Radio et DDX_Control pour le même contrôle, il serait assez inutile sinon. Pouvez-vous élaborer sur
"maintenant, si je ne l'appel à DDX_Control, chaque fois que DoDataExchange est appelée, l'application se bloque parce que DDX_Control forces RB_LEFT pour traiter un message qui DDX_Radio ne peut pas gérer. Cette partie, je comprends."
parce que je pense que c'est déjà un symptôme du problème sous-jacent.
OriginalL'auteur Roel