我有一个 MFC 对话框,其中有两个单选按钮。我把他们放在一个很好的组里,他们的 IDC 一个接一个(RB_LEFT, RB_RIGHT
)。
我想使用DDX_Radio
,所以我可以使用整数值访问按钮,所以在DoDataExchange
我调用的函数中:
DDX_Radio(pDX, RB_LEFT, mRBLeftRight);
其中mRBLeftRight
是integer
类型的成员变量。我还需要编辑按钮属性,所以我想使用 aDDX_Control
将它们映射到成员变量mRBLeft
和mRBRight
( CButton
):
DDX_Control(pDX, RB_LEFT, mRBLeft);
DDX_Control(pDX, RB_RIGHT, mRBRight);
现在,如果我调用DDX_Control
,无论何时DoDataExchange
调用,应用程序都会崩溃,因为DDX_Control
强制处理无法RB_LEFT
处理的消息。DDX_Radio
这部分我明白了。
我决定不使用DDX_Control
(删除 中的调用),而只在我的类中DoDataExchange
保留一个指向我的单选按钮 ( ) 的指针。CButton*
所以在我的OnInitDialog
函数中,我做了以下调用:
mRBLeft= ((CButton*)GetDlgItem(RB_LEFT));
mRBRight = ((CButton*)GetDlgItem(RB_RIGHT));
现在只要我不使用mRBLeft
它就可以了,但是如果我这样做了,bam,crash on DoDataExchange
。真正让我感到困惑的是,如果我使用
((CButton*)GetDlgItem(RB_LEFT)->SetCheck(true)
它来改变我的左单选按钮,它就会起作用。苏有什么区别?
(我知道这很麻烦,但我只想了解机制)