MFC:在基于对话的SDI与MDI之间进行选择

时间:2014-09-29 12:58:37

标签: visual-c++ mfc

我对MFC应用程序有以下要求:

Dialog 1 --> Dialog 2 --> Dialog 3 --> Dialog 4 -->  Dialog 5
    ^           |             |             ^           ^  |
    |           ----------------------------            |  |
    |                         |                         |  |
    |                         --------------------------   | 
    --------------------------------------------------------
  • 从Dlg1导航到Dlg2到Dlg3到Dlg4到Dlg5
  • 从Dlg2导航到Dlg4
  • 从Dlg3导航到Dlg5
  • 从Dlg5导航回Dlg1
  • 导航后,例如Dlg1到Dlg2,流行的对话框(Dlg1)不可见
  • 用户在导航时不会看到它是一个不同的对话框(例如从Dlg1到Dlg2),他应该感觉有一个应用程序。

问题:我应该使用哪种应用类型? (SDI,MDI,基于对话)

4 个答案:

答案 0 :(得分:1)

选项卡式对话框怎么样?从基于对话框的体系结构开始,但用CPropertySheet替换主对话框。对话框1到对话框5将成为选项卡表中的页面。

答案 1 :(得分:0)

选择SDI或MDI。很多时候像你这样的初始要求使SDI最合适,但人们通常必须在路的尽头将SDI转换为MDI,所以如果你想立即启动MDI,请使用自己的判断但是考虑到你今天的要求SDI是不错的选择

您也可以使用Dialog实现相同的功能并使用DoModal(),但每次都会成为一个新窗口。我实际上是自己做的,因为我不得不使用CDialog,这就是我做的方式:

// here how I exit from say a given dialog to a different screen.
void CSummaryDlg::OnBnClickedButtonBack()
{
    EndDialog( Batch::BatchGoBack ); // goes to previous dialog
}


void CSummaryDlg::OnBnClickedButtonExitBatch()
{
    EndDialog( Batch::BatchComplete ); // finishes all dialogs in the chain.
}

// how ending all dialog takes places (example of propagation)
void CResultDlg::OnBnClickedButtonViewReport()
{
    CSummaryDlg dlg;

    int dlgResult = dlg.DoModal();

    if ( dlgResult == Batch::BatchComplete )
        EndDialog( Batch::BatchComplete );
}

答案 2 :(得分:0)

我建议创建SDI应用程序然后删除所有文档和视图类。只保留CFrameWnd和CWinApp类。使CFrameWnd不可调整大小并动态创建所有子对话框。那么你将有一个窗口CFrameWnd,里面有许多动态加载对话框。

答案 3 :(得分:0)

您可以使用空对话框创建基于对话框的应用程序,然后将所需对话框动态插入为填充外部对话框的整个客户区域的新窗口。设置内部对话框的DS_CONTROL style。当您从一个对话框切换到另一个对话框时,您可以销毁旧对话框,或者只是隐藏它以便在以后再次需要时再次激活它。