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

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

最佳答案

我会利用 MFC 的 DDX/DDV 机制自动处理单选按钮行为(否则,您最终不得不为自己的单选按钮行为做变通)。

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

枚举{RADIO_OPTION1, RADIO_OPTOIN2, RADIO_OPTION3};

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

关于c++ - 以编程方式在 MFC 中设置单选按钮状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30153861/

相关文章:

mfc - 对话使用分析/热图工具

android - 如何在 Android 中设置单选按钮

c++ - 如何为 C 脚本配置 lighttpd 和 fcgi?

c++ - 模板模板推导给我一个通用引用的错误

c++ - 为什么我不能在这种情况下使用 push_back?

visual-studio-2010 - 如何在项目中定位(和删除)MFC 相关代码?

c++ - 没有复制文件的 TeamCity 依赖?

c++ - PPL 任务 - 在桌面应用程序的 UI 线程中继续

excel - 如何检查工作表上是否存在选项按钮?

javascript - AngularJS ng-repeat 具有多个 radio 输入