MFC单选按钮 - DDX_Radio和DDX_Control行为

时间:2009-07-22 14:21:00

标签: c++ mfc radio-button

我有一个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) 它会起作用。那么有什么区别?

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

2 个答案:

答案 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_ControlDDX_Radio时出现问题:)这是一个解决问题的小黑客。

  

单选按钮变量

     

另一个内在问题,即   代表某种奇怪的   微软的哲学观点,   是你不能被允许的   为无线电创建控制变量   纽扣。这毫无意义。他们   有一些奇怪的想法是唯一的方法   你将操纵单选按钮   是通过索引。这是绝望的   不足。因此,你必须去   通过一些严重的扭曲来   获取收音机的控制变量   的按钮。

     

你要做的第一件事就是去吧   返回并将所有单选按钮标记为   拥有WS_GROUP风格。只要   具有WS_GROUP样式的单选按钮   可以有一个控制变量。然而,   如果你用它们标记所有这些   WS_GROUP,创建控件   变量,然后删除   WS_GROUP属性,一切正常   好的,谢谢。我们为什么要这样做   通过这些额外的步骤没有   任何感觉,但像派生的   上课问题,我一直在抱怨   关于这个多年没有任何影响。   我的问题是我一直在忘记   返回并撤消所有WS_GROUP   属性,所以我第一次运行   之后的程序我发现了所有   我的收音机按钮是一键式的   组。哎呦。 $#%!修复,和   重新编译/重新链接。