C++ 如何使用do模式关闭对话框

C++ 如何使用do模式关闭对话框,c++,visual-c++,mfc,modal-dialog,C++,Visual C++,Mfc,Modal Dialog,好的,基本上我有一个MFC应用程序,有很多对话框需要循环。基本上,当您单击一个按钮转到另一个对话框时,我希望上一个对话框关闭。现在,对话框只是显示在彼此的顶部。打开新对话框后,如何关闭该对话框?下面是一些示例代码: void CMachine2Dlg::OnBnClickedNewmc() { NameDlg Dlg; Dlg.DoModal() } 你可以试着打电话 EndDialog(nResult); 你可以试着打电话 EndDialog(nRe

好的,基本上我有一个MFC应用程序,有很多对话框需要循环。基本上,当您单击一个按钮转到另一个对话框时,我希望上一个对话框关闭。现在,对话框只是显示在彼此的顶部。打开新对话框后,如何关闭该对话框?下面是一些示例代码:

void CMachine2Dlg::OnBnClickedNewmc()
{
    NameDlg Dlg;
    Dlg.DoModal()       

    }
你可以试着打电话

EndDialog(nResult);
你可以试着打电话

EndDialog(nResult);

很难像你提到的那样把这些对话联系起来。Do modal通常意味着完全实现您正在经历的事情。Ie:在上一个对话框上弹出一个对话框

一种方法是在调用第一个对话框的类中创建模态对话框序列,并使用前一个对话框的返回值确定是否需要显示第二个对话框,以此类推

例如:

// 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!
}

我将远离无模式对话框,您将遇到另一个问题,例如如何控制对话框的流动并防止人们单击您应用程序后面的主窗口。

很难按照您提到的方式链接这些对话框。Do modal通常意味着完全实现您正在经历的事情。Ie:在上一个对话框上弹出一个对话框

一种方法是在调用第一个对话框的类中创建模态对话框序列,并使用前一个对话框的返回值确定是否需要显示第二个对话框,以此类推

例如:

// 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!
}
我将远离无模式对话框,您将遇到另一个问题,例如如何控制对话框的流动并防止人们单击您应用程序后面的主窗口。

OnOK、OnCancel或EndDialognResult将回答您的标题问题

但是,就像@tenfour建议的那样,您应该使用属性表/向导。它也可以是一个对话框窗口,其中包含多个子属性页窗口,您可以根据希望看到的内容显示或隐藏这些窗口

为此,您需要:

1个对话框窗口,可能带有上一个/下一个按钮 1个图片框,框架样式,不可见,位于要显示子窗口的对话框内 n属性页,子样式,无边框,放置所有控件的位置。 为对话框和每个属性页创建一个类,将每个属性页的成员变量添加到对话框中,创建属性页并使用框架作为引用来放置它们。单击按钮,只需显示/隐藏必要的页面。

OnOK、OnCancel或EndDialognResult将回答您的标题问题

但是,就像@tenfour建议的那样,您应该使用属性表/向导。它也可以是一个对话框窗口,其中包含多个子属性页窗口,您可以根据希望看到的内容显示或隐藏这些窗口

为此,您需要:

1个对话框窗口,可能带有上一个/下一个按钮 1个图片框,框架样式,不可见,位于要显示子窗口的对话框内 n属性页,子样式,无边框,放置所有控件的位置。
为对话框和每个属性页创建一个类,将每个属性页的成员变量添加到对话框中,创建属性页并使用框架作为引用来放置它们。单击按钮,只需显示/隐藏必要的页面。

@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
等等


这样一来,您就不必轻易控制正在发生的事情,也不必弄乱不同的窗口、消息循环。

@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
等等


这样,您就不必很容易地控制正在发生的事情,也不必弄乱不同的窗口、消息循环。

您可以在创建新对话框时隐藏父对话框,并在新对话框结束后销毁它。我还没有测试下面的ShowWindow,但是你知道了,如果它没有隐藏对话框,请寻找另一个类似的函数

void CMachine2Dlg::OnBnClickedNewmc()
{
   ShowWindow( SW_HIDE);

   NameDlg Dlg;
   Dlg.DoModal();

   EndDialog( 0 );

}

您可以做的是在创建新对话框时隐藏父对话框,并在新对话框结束后销毁它。我还没有测试下面的ShowWindow,但是你知道了,如果它没有隐藏对话框,请寻找另一个类似的函数

void CMachine2Dlg::OnBnClickedNewmc()
{
   ShowWindow( SW_HIDE);

   NameDlg Dlg;
   Dlg.DoModal();

   EndDialog( 0 );

}
您可以在dialog类中调用OnCancel。比如:这个->取消

您可以在dialog类中调用OnCancel。比如:这个->取消

你有没有考虑过使用一种新的方法?哦,天哪,我听起来像克利比!你有没有考虑过使用一种新的方法?哦,天哪,我听起来像克利比!