【问题标题】:Programmatically set radio button state in MFC在 MFC 中以编程方式设置单选按钮状态
【发布时间】:2015-05-10 16:35:14
【问题描述】:

我有一个简单的问题让我有点发疯。我有一个基于对话框的 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();
}

【问题讨论】:

  • 您可以简化此操作,将OnBnClickedRadio3 更改为调用if (IDCANCEL==testDlg.DoModal()) CheckRadioButton(...) 这样CTestDlg 将被删除为可疑。您也许应该显示消息映射,否则这里显示的内容应该没有任何问题。
  • 感谢您的建议。不幸的是(我没有说清楚),这个问题实际上出现在一个更大、更复杂的程序中,其中子对话框是非模态的。我发布的代码是我试图缩小范围以产生最简单的问题示例。实际上,我确实需要将信息从(非模态)对话框反馈给其父级,表明用户已关闭非模态对话框,并且父级必须更改其按钮状态作为响应。我试过发一条消息,但这并不比直接打电话给家长更好。

标签: c++ mfc radio-button


【解决方案1】:

我会利用 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
}

【讨论】:

  • 我很欣赏这个建议,但这实际上是我的起始代码揭示了问题。我一直在尝试将事情降到最低限度,以缩小问题的可能根源。
  • @BillHeitler 您的 m_iRadio 值是否始终正确?如果不是,那么它可能只是您的资源定义的问题。 (见下一条评论,这条太长了)。
  • 必须正确配置单选按钮组,即组中的第一个单选按钮必须在资源定义中标识为 GROUP 的开头。然后,在最后一个单选按钮之后的控件(或者如果在控件列表的末尾则绕回开头)必须具有 GROUP 设置也可以“结束”单选按钮组。如果缺少,或者在“下一个”组之前有其他“按钮”,您的 DDX/DDV 代码将出现不良行为。
【解决方案2】:

如果您想检查 ID 为 IDC_RADIO1 的单选按钮。 m_Radio 是单选按钮组的控制变量。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-15
    • 2011-08-15
    • 1970-01-01
    • 1970-01-01
    • 2019-03-25
    • 2023-03-08
    • 1970-01-01
    • 2018-02-17
    相关资源
    最近更新 更多