MFC单选按钮 - DDX_Radio和DDX_Control行为

lev*_*que 9 c++ mfc radio-button

我有一个MFC对话框,其中有两个单选按钮.我已将它们放在一个很好的组中,它们的IDC是一个接一个(RB_LEFT, RB_RIGHT).

我想使用DDX_Radio所以我可以使用整数值访问按钮,所以在DoDataExchange函数中我调用:

   DDX_Radio(pDX, RB_LEFT, mRBLeftRight);
Run Code Online (Sandbox Code Playgroud)

其中mRBLeftRight是整数类型的成员变量.我还需要编辑按钮属性,所以我想用a DDX_Control来映射成员变量mRBLeft和mRBRight(CButton):

   DDX_Control(pDX, RB_LEFT, mRBLeft);
   DDX_Control(pDX, RB_RIGHT, mRBRight);
Run Code Online (Sandbox Code Playgroud)

现在,如果我进行调用DDX_Control,每当调用DoDataExchange时,应用程序崩溃,因为DDX_Control强制RB_LEFT处理DDX_Radio无法处理的消息.这一部分我明白了.

我决定不使用DDX_Control(删除DoDataExchange中的调用)并在我的类中保留指向我的单选按钮(CButton*)的指针.所以在我的OnInitDialog函数中,我执行以下调用:

   mRBLeft= ((CButton*)GetDlgItem(RB_LEFT));
   mRBRight = ((CButton*)GetDlgItem(RB_RIGHT));
Run Code Online (Sandbox Code Playgroud)

现在,只要我不使用mRBLeft就可以了,但是如果我这样做的话,bam会在DoDataExchange上崩溃.让我感到困惑的是,如果我改变我的左侧单选按钮, ((CButton*)GetDlgItem(RB_LEFT)->SetCheck(true) 它会起作用.那么有什么区别?

(我知道这很麻烦,但我只是想了解机制)

Goz*_*Goz 8

TBH它比JC的帖子更容易让你相信.

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

m_Val   = 0;
DDX_Radio( pDX, IDC_RADIO3, m_Val );
Run Code Online (Sandbox Code Playgroud)

您需要使用WS_GROUP(在本例中为IDC_RADIO3)标记组中的FIRST单选按钮.你现在好了,它将自动选择IDC_RADIO3).

现在为了使m_Val保持最新,可能值得在组中的所有单选按钮上放置一个单击处理程序.在该函数内部,只需调用UpdateData(TRUE); m_Val现在将指向组中单选按钮的索引.