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