【发布时间】: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