2014-09-29 82 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