在MFC中以编程方式设置单选按钮状态



我有一个简单的问题,这使我有些疯狂。我有一个基于对话框的MFC应用程序,上面有3个无线电按钮,每个按钮都有一个单击处理程序做不同的操作。

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

这首先在我添加功能的大型桌面应用中显而易见,但它也发生在一个简单的基于对话的应用程序中,我将其组合在一起来测试事物。

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

我可能在做一些愚蠢的事情,但是我看不到它是什么!我正在使用Visual Studio2013。任何帮助都非常感谢。


// 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();
}

我将利用MFC的DDX/DDV机制自动处理无线电按钮行为(否则,您最终必须为自己的无线电键行为做工作措施)。

添加单个按钮控制数据成员,m_iradio(基于0的无线电按钮组枚举)。然后在您的checkradiobutton()中,只需将m_iradio设置为基于0的值而不是控制ID

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

如果要使用IDC_RADIO1检查RadioButton。m_radio是Radiobutton组的控制变量。

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

最新更新