2009-07-22 17 views
8

J'ai une boîte de dialogue MFC dans laquelle se trouvent deux boutons radio. Je les ai mis dans un bon groupe, leurs IDC sont l'un après l'autre (RB_LEFT, RB_RIGHT).Boutons radio MFC - Comportement DDX_Radio et DDX_Control

Je veux utiliser DDX_Radio pour que je puisse accéder aux boutons en utilisant une valeur entière ainsi dans la fonction DoDataExchange j'appelle:

DDX_Radio(pDX, RB_LEFT, mRBLeftRight); 

où mRBLeftRight est une variable membre de type entier. Je dois aussi modifier les propriétés des boutons, donc je voulais utiliser un DDX_Control pour les mapper sur les variables membres mRBLeft et mRBRight (CButton):

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

si je fais l'appel à DDX_Control, chaque fois que DoDataExchange est appelée, le l'application se bloque car DDX_Control force RB_LEFT à gérer un message que DDX_Radio ne peut pas gérer. Cette partie je comprends.

J'ai décidé de ne pas utiliser DDX_Control (supprimé les appels dans DoDataExchange) et de simplement garder un pointeur sur mes boutons radio (CButton *) dans mes classes. Donc, dans ma fonction OnInitDialog, je fais les appels suivants:

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

Maintenant, tant que je ne l'utilise mRBLeft ça va bien, mais si je le fais, bam, accident sur DoDataExchange. La chose qui me laisse vraiment perplexe est que si je change mon bouton radio gauche en utilisant ((CButton*)GetDlgItem(RB_LEFT)->SetCheck(true) ça va marcher. Sooo quelle est la différence?

(Je sais qu'il est beaucoup de tracas pour peu, mais je veux juste comprendre la mécanique)

+0

J'ai lu quelque part que je ne devrais pas stocker un pointeur retourné à partir de GetDlgItem, ce qui est probablement juste, peut-être c'est la cause de mon problème? – levesque

Répondre

7

TBH C'est encore plus facile que la publication de JC vous laisse croire.

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

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

Vous devez marquer le bouton radiotélescopes dans le groupe avec WS_GROUP (Dans ce cas IDC_RADIO3). Vous êtes maintenant prêt à partir et il sélectionnera automatiquement IDC_RADIO3). Maintenant, pour garder m_Val à jour, il est probablement utile de placer un gestionnaire de clic sur tous les boutons radio du groupe. À l'intérieur de cette fonction, appelez simplement UpdateData (TRUE); m_Val pointe maintenant sur l'index du bouton radio du groupe.

+0

J'ai marqué le premier bouton radio avec 'WS_GROUP' ... – levesque

+0

Je l'ai fait exactement .. croyez-moi, il va planter si vous utilisez le m_r3. – levesque

+2

Étrange ... pour composer une phrase, "Works on my machine" ... – Goz

1

Il y a une erreur dans vos locaux. Vous pouvez utiliser DDX_Radio et DDX_Control pour le même contrôle, il serait assez inutile sinon. Pouvez-vous élaborer sur

"maintenant si je fais l'appel à DDX_Control, à chaque appel de DoDataExchange, l'application se bloque car DDX_Control force RB_LEFT à gérer un message que DDX_Radio ne peut pas gérer.

parce que je pense que c'est déjà un symptôme du problème sous-jacent.

+0

J'ai trouvé la réponse, si ça vous intéresse :) – levesque

3

Je trouve la réponse ici: http://www.flounder.com/getdlgitem.htm

Il y a un problème avec l'utilisation DDX_Control et DDX_Radio en même temps :) Ce petit hack pour contourner le problème.

variables bouton radio

Un autre problème intrinsèque, qui représente une sorte d'étrange point de vue philosophique de Microsoft, est que vous ne devez pas être autorisé à créer des variables de contrôle pour les boutons radio . Cela n'a aucun sens. Ils ont une idée étrange que la seule façon de manipuler les boutons radio est via un index. C'est désespérément inadéquate.Par conséquent, vous devez aller à travers quelques contorsions sérieuses à obtenir des variables de contrôle pour vos boutons radio .

La première chose que vous avez à faire est d'aller retour et marquer tous les boutons radio comme ayant le style WS_GROUP. Seuls les boutons radio avec un WS_GROUP style peuvent avoir une variable de contrôle. Cependant, si vous marquez tous avec WS_GROUP, créez le contrôle des variables, puis retirez la WS_GROUP attribut, tout fonctionne très bien , je vous remercie. Pourquoi nous devons passer par ces étapes supplémentaires ne fait aucun sens que ce soit, mais comme le problème des classes dérivé, je me suis plaint à ce sujet pendant des années sans effet. Mon problème est que je continue à oublier revenir en arrière et annuler toutes les WS_GROUP attributs, donc la première fois que je lance le programme après cela, je trouve que tous les mes boutons radio sont un bouton groupes. Oups. $ #%! Corriger et recompiler/relier.

+1

Hmm je ne comprends toujours pas, cela a toujours fonctionné comme prévu pour moi. Comme mentionné ci-dessous, vous devez définir le style du premier contrôle à WS_GROUP, puis cela fonctionne. Eh bien, au moins vous avez résolu votre problème. – Roel

+1

Pour info, je viens de trébucher sur cette question et j'ai pensé que je vous le ferais savoir, je n'ai pas ce problème, et le conseil standard de Goz est ce que j'utilise. Cela pourrait indiquer un problème plus profond pour vous. –

+0

@Mark, par une étrange coïncidence, j'ai couru à travers cela aujourd'hui aussi. Cette réponse est un mauvais conseil, elle représente un malentendu sur le fonctionnement de DDX_Radio. Vous vous ouvrez à beaucoup de chagrin quand vous allez contrairement à 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. –

Questions connexes