【问题标题】:How to close a dialog box using do modal如何使用 do modal 关闭对话框
【发布时间】:2011-12-14 19:23:47
【问题描述】:
好的,基本上我有一个 MFC 应用程序,其中包含许多需要循环执行的对话框。基本上,当您单击一个按钮转到另一个对话框时,我希望关闭前一个对话框。现在,对话框只是显示在彼此的顶部。新对话框打开后如何关闭对话框?下面是一些示例代码:
void CMachine2Dlg::OnBnClickedNewmc()
{
NameDlg Dlg;
Dlg.DoModal()
}
【问题讨论】:
标签:
c++
visual-c++
mfc
modal-dialog
【解决方案1】:
你可以试试打电话
EndDialog(nResult);
【解决方案2】:
IT 将很难按照您提到的方式链接这些对话。 Do modal 通常意味着准确地实现您正在经历的事情。即:对话框弹出前一个。
一种方法是在调用第一个对话框的类中创建模态对话框序列,并使用前一个对话框的返回值来确定是否需要显示第二个对话框,依此类推。
例如:
// define a bunch of constants, any number would do,
// I would avoid 0 and 1 as they usually mean success/error
// This code can be returned in the EndDialog call in a method of your choice (say button click handler).
const int c_needNextDialog = 101;
dialog1 dlg1;
if( dlg1.DoModal() == c_needNextDialog )
{
dialog2 dlg2;
if( dlg2.DoModal() == c_needNextDialog )
{
... and so forth
}
}
我相信你明白了......
在您的对话框中,您会这样返回(直接取自 msf)
void dialog1::OnSomeAction()
{
// Do something
EndDialog(c_needNextDialog); // This value is returned by DoModal!
// Do something
return; // Dialog closed and DoModal returns only here!
}
我会远离无模式对话框,您最终会遇到另一个问题,例如如何控制对话框的流程并阻止人们点击您应用程序的主窗口。
【解决方案3】:
OnOK()、OnCancel() 或 EndDialog(nResult) 将回答您的标题问题。
但是,就像@tenfour 建议的那样,您应该使用属性表/向导。它也可以是单个对话框窗口,其中包含多个子属性页窗口,您可以根据需要显示或隐藏这些子属性页窗口。
为此,您需要:
- 1 个对话窗口,可能带有 Prev/Next 按钮
- 1 个图片框,框架样式,不可见,在您希望子窗口出现的对话框内
- n 个属性页,子样式,无边框,您可以在其中放置所有控件。
为对话框和每个属性页创建一个类,将每个属性页的成员变量添加到对话框中,创建属性页并使用框架作为参考来放置它们。在按钮上单击仅显示/隐藏必要的页面。
【解决方案4】:
@tenfour 提出一个好的可能解决方案
但如果这对你来说不可能
您应该从一个基本窗口/Dlg 中创建对话框
Mydialog dlg1
if(dlg1.DoModal() )
{
//do something
}
else
// do something else
Mydialog dlg2
if(dlg2.DoModal() )
{
//do something
}
else
// do something else
等等……
这样你就不能轻松控制“正在发生的事情”,也不必搞乱不同的窗口、消息循环。
【解决方案5】:
您可以做的是在您DoModal() 新对话框时隐藏父对话框,并在新对话框结束后将其销毁。我没有测试过下面的ShowWindow(),但你明白了,如果它不隐藏对话框,请寻找另一个类似的功能。
void CMachine2Dlg::OnBnClickedNewmc()
{
ShowWindow( SW_HIDE);
NameDlg Dlg;
Dlg.DoModal();
EndDialog( 0 );
}
【解决方案6】:
您可以在对话框类中调用 OnCancel()。点赞:this->OnCancel();