我有一个MFC对话框,其中有两个单选按钮。我已将它们放在一个很好的组中,它们的IDC是一个接一个(RB_LEFT, RB_RIGHT
)。
我想使用DDX_Radio
所以我可以使用整数值访问按钮,所以在函数DoDataExchange中我调用:
DDX_Radio(pDX, RB_LEFT, mRBLeftRight);
其中mRBLeftRight是整数类型的成员变量。我还需要编辑按钮属性,所以我想使用DDX_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会在DoDataExchange上崩溃。让我感到困惑的是,如果我改变我的左侧单选按钮
((CButton*)GetDlgItem(RB_LEFT)->SetCheck(true)
它会起作用。那么有什么区别?
(我知道这很麻烦,但我只是想了解机制)
答案 0 :(得分:7)
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 );
您需要使用WS_GROUP标记组中的FIRST单选按钮(在本例中为IDC_RADIO3)。你现在好了,它会自动选择IDC_RADIO3。
现在为了使m_Val保持最新,可能值得在组中的所有单选按钮上放置一个单击处理程序。在该函数内部,只需调用UpdateData(TRUE); m_Val现在将指向组中单选按钮的索引。
答案 1 :(得分:3)
我在这里找到答案:http://www.flounder.com/getdlgitem.htm
同时使用DDX_Control
和DDX_Radio
时出现问题:)这是一个解决问题的小黑客。
单选按钮变量
另一个内在问题,即 代表某种奇怪的 微软的哲学观点, 是你不能被允许的 为无线电创建控制变量 纽扣。这毫无意义。他们 有一些奇怪的想法是唯一的方法 你将操纵单选按钮 是通过索引。这是绝望的 不足。因此,你必须去 通过一些严重的扭曲来 获取收音机的控制变量 的按钮。
你要做的第一件事就是去吧 返回并将所有单选按钮标记为 拥有
WS_GROUP
风格。只要 具有WS_GROUP
样式的单选按钮 可以有一个控制变量。然而, 如果你用它们标记所有这些WS_GROUP
,创建控件 变量,然后删除WS_GROUP
属性,一切正常 好的,谢谢。我们为什么要这样做 通过这些额外的步骤没有 任何感觉,但像派生的 上课问题,我一直在抱怨 关于这个多年没有任何影响。 我的问题是我一直在忘记 返回并撤消所有WS_GROUP
属性,所以我第一次运行 之后的程序我发现了所有 我的收音机按钮是一键式的 组。哎呦。 $#%!修复,和 重新编译/重新链接。