好的,基本上我有一个MFC应用程序,其中包含许多需要循环的对话框。基本上,当您单击一个按钮转到另一个对话框时,我希望关闭上一个对话框。现在,对话框只显示在彼此的顶部。打开新对话框后,如何关闭对话框?以下是一些示例代码:
void CMachine2Dlg::OnBnClickedNewmc()
{
NameDlg Dlg;
Dlg.DoModal()
}
答案 0 :(得分:6)
您可以做的是在DoModal()
新对话框时隐藏父对话框,并在新对话框结束后将其销毁。我没有测试过下面的ShowWindow()
但是你明白了,如果它没有隐藏对话框,那就找另一个类似的函数了。
void CMachine2Dlg::OnBnClickedNewmc()
{
ShowWindow( SW_HIDE);
NameDlg Dlg;
Dlg.DoModal();
EndDialog( 0 );
}
答案 1 :(得分:5)
很难按照你提到的方式将这些对话链接起来。模态通常意味着实现您正在经历的内容。即:对话框弹出前一个对话框。
执行此操作的一种方法是在类中创建模式对话框序列,该类调用第一个对话框并使用上一个对话框的返回值来确定是否需要显示第二个对话框,依此类推。
例如:
// 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!
}
我会忽略无模式对话框,你最终会遇到另一个问题,例如如何控制对话框的流程,并阻止人们点击后面的应用程序的主窗口。
答案 2 :(得分:2)
您可以尝试拨打
EndDialog(nResult);
答案 3 :(得分:2)
OnOK()
,OnCancel()
或EndDialog(nResult)
会回答您的标题问题。
但是,就像@tenfour建议的那样,你应该使用属性表/向导。它也可以是一个单独的对话框窗口,其中显示或隐藏了几个子属性页面窗口,具体取决于您希望看到的内容。
为此,您需要:
为对话框和每个属性页创建一个类,将每个属性页的成员变量添加到对话框,创建属性页并使用框作为参考来放置它们。在按钮上单击只显示/隐藏必要的页面。
答案 4 :(得分:1)
@tenfour建议一个很好的解决方案 但如果它不适合你 你应该从一个基本的windows / Dlg
创建对话框Mydialog dlg1
if(dlg1.DoModal() )
{
//do something
}
else
// do something else
Mydialog dlg2
if(dlg2.DoModal() )
{
//do something
}
else
// do something else
依旧......
通过这种方式,您无法轻松控制“发生了什么”,并且您不必使用不同的窗口,消息循环。
答案 5 :(得分:1)
您可以在对话框类中调用 OnCancel()。喜欢:this->OnCancel();