以编程方式在MFC

时间:2015-05-10 16:35:14

标签: c++ mfc radio-button

我有一个简单的问题让我有点疯狂。我有一个基于对话框的MFC应用程序,它上面有3个单选按钮,每个按钮都有一个执行不同操作的单击处理程序。

第三个按钮激活一个单独的模态对话框,该对话框具有OnCancel处理程序。 OnCancel处理程序在父对话框上调用CheckRadioButton,尝试将检查设置为组中的第一个按钮(从而指示模态对话框不再启动)。这确实正确地设置了检查,但由于某种原因它还生成对第三个单选按钮单击处理程序的调用,因此模式对话框重新出现。这种情况反复发生(大约7次),直到最终重复的呼叫停止,模态对话框消失,所有这些都显然是正常的。

这首先在我添加功能的大型桌面应用程序中变得明显,但它也出现在一个简单的基于对话框的简单应用程序中,我将它放在一起进行测试。

我尝试了各种方法,包括使用CButton::SetCheck,还有一个控制变量并使用UpdateData(FALSE)。所有这些都会产生同样的问题。

我可能做了一些愚蠢的事,但我看不出它是什么! 我使用的是Visual Studio 2013.任何帮助都非常感谢。

// in parent dialog
void Ctest_radioDlg::OnBnClickedRadio3()
{
    TRACE(_T("Clicked 3"));
    CTestDlg testDlg;
    testDlg.m_pParent = this;
    testDlg.DoModal();
}

// in modal dialog
void CTestDlg::OnCancel()
{
    m_pParent->CheckRadioButton(IDC_RADIO1, IDC_RADIO3, IDC_RADIO1);
    CDialogEx::OnCancel();
}

2 个答案:

答案 0 :(得分:1)

如果要检查ID为IDC_RADIO1的单选按钮。 m_Radio是radiobutton组的对照变量。

m_Radio.GetParent()->CheckRadioButton(IDC_RADIO1, IDC_RADIO2, IDC_RADIO1);

答案 1 :(得分:0)

我会利用MFC的DDX / DDV机制自动处理单选按钮行为(否则,您最终必须为自己的单选按钮行为进行解决方法)。

添加单选按钮控件数据成员m_iRadio(基于0的单选按钮组枚举)。然后在CheckRadioButton()中,只需将m_iRadio设置为基于0的值而不是控件ID

enum {RADIO_OPTION1,RADIO_OPTOIN2,RADIO_OPTION3};

Ctest_radioDlg::CheckRadioButton(int eRadioOption)
{
  m_iRadio = eRadioOption;
  UpdateData(false);  // MFC magic occurs here
}