9

我有一个 MFC 对话框,其中有两个单选按钮。我把他们放在一个很好的组里,他们的 IDC 一个接一个(RB_LEFT, RB_RIGHT)。

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

DDX_Radio(pDX, RB_LEFT, mRBLeftRight);

其中mRBLeftRightinteger类型的成员变量。我还需要编辑按钮属性,所以我想使用 aDDX_Control将它们映射到成员变量mRBLeftmRBRight( 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) 它来改变我的左单选按钮,它就会起作用。苏有什么区别?

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

4

2 回答 2

9

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(在这种情况下IDC_RADIO3)标记组中的第一个单选按钮。您现在可以开始了,它会自动选择IDC_RADIO3)。

现在要保持m_Val最新状态,可能值得在组中的所有单选按钮上放置一个单击处理程序。简单地说,在该函数内部, callUpdateData( TRUE ); m_Val现在将指向组中单选按钮的索引。

于 2009-07-22T14:59:48.880 回答
3

我在这里找到了答案:http: //www.flounder.com/getdlgitem.htm

同时使用DDX_Controland存在问题DDX_Radio:) 这是解决问题的一个小技巧。

单选按钮变量

另一个代表微软某种奇怪哲学观点的内在问题是,你不能被允许为单选按钮创建控制变量。这是没有意义的。他们有一些奇怪的想法,即您操纵单选按钮的唯一方法是通过索引。这是无可救药的不足。因此,您必须经历一些严重的扭曲才能获得单选按钮的控制变量。

您要做的第一件事是返回并将所有单选按钮标记为具有WS_GROUP样式。只有具有WS_GROUP样式的单选按钮才能具有控制变量。但是,如果您用 标记所有这些 WS_GROUP,创建控制变量,然后删除 WS_GROUP属性,一切正常,谢谢。为什么我们必须经历这些额外的步骤毫无意义,但就像派生类问题一样,我多年来一直在抱怨这个问题,但没有任何效果。我的问题是我一直忘记返回并撤消所有WS_GROUP 属性,所以在此之后第一次运行程序时,我发现我所有的单选按钮都是单按钮组。哎呀。$#%!修复并重新编译/重新链接。

于 2009-07-22T14:55:24.490 回答