2014-09-29 79 views
1

一个对话框之间选择我有以下我的MFC应用程序的要求:MFC:基于VS SDI VS MDI

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,基于对话框)

+0

这听起来像一个带有自定义导航的标准CPropertySheet向导。 – user1793036 2014-10-01 04:18:16

回答

0

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

+0

这听起来很有趣。你可以添加一个代码示例如何“动态创建所有子对话框”?谢谢。 – Nextremos 2014-09-29 15:25:31

+0

https://drive.google.com/file/d/0By_5E4_MNQcdMzJHbllJbHBESzQ/edit?usp=sharing。在示例中,对话框是从功能区加载的,但在您的情况下,您可以从任意位置删除功能区和状态栏并调用CMainFrame :: OpenDialog()。 – 2014-09-30 07:03:11

+0

我终于让你的例子在VS 2005中为我工作。我将继续解决你的问题。谢谢。 – Nextremos 2014-09-30 15:27:42

1

标签式对话框如何?从基于对话框的体系结构开始,但用CPropertySheet替换主对话框。对话框1到对话框5将成为标签页中的页面。

+0

这确实是一个解决方案,但是我的要求比上面描述的要复杂得多。最后,我将有100个不同的“对话框”,我不知道我是否可以在标签中管理这个? – Nextremos 2014-09-29 13:57:54

+0

您确实可以,您甚至可以根据需要在控件中创建并插入选项卡(即,在用户点击“Dialog78”中的“下一个”之前不需要创建Dialog79页面),并且还可以销毁旧页面。 – 2014-09-29 16:47:34

+1

您也可以使用CPropertySheet实现“向导”类型的用户界面。您的应用程序是否为向导类型应用程序建模?(即,您绘制的图表可以扩展为包括UI的主要流程)。请注意,您可以在“主要流程”对话框上具有“辅助”按钮来启动用于执行“辅助”配置功能的模式对话框。 – franji1 2014-09-30 02:48:45

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); 
} 
+0

谢谢你的信息zadane。在我创建SDI应用程序的情况下,是否可以将我在VS资源视图中创建的“正常”对话框加载到SDI应用程序的视图部分中。罗伯特瓦莱卡提到了一些事情(见下文)。 – Nextremos 2014-09-29 18:34:21

+0

@Nextremos您将拥有CFormViews而不是CDialog,您可以根据需要动态切换。你将不得不实现自己的窗口切换..有代码在那里。 – zar 2014-09-29 18:59:25

0

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

+0

在问这个论坛之前,我尝试了你的建议。当我完成这个操作时,我遇到了关闭初始(第一个对话框)的问题,应用程序退出。我试图通过动态创建对话框来使用ShowWindow,但是我失败了。 如果我正确地使用你,你会保留最初的空白对话框并动态替换第二个(可见)对话框? – Nextremos 2014-09-29 18:43:04

+0

@Nextremos我认为你有它 - 外部对话框一直保持打开,直到用户退出,但内部对话框会根据需要进行替换。 – 2014-09-29 18:53:15