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)
它会起作用.那么有什么区别?
(我知道这很麻烦,但我只是想了解机制)
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现在将指向组中单选按钮的索引.
| 归档时间: |
|
| 查看次数: |
18730 次 |
| 最近记录: |