2013-02-02 85 views
1

多個視圖我試圖建立一個MFC SDI(單文檔界面)應用程序符合這些要求:MFC SDI與基於文件擴展名

  1. 顯示在同一時間只有一個文檔。

  2. 支持基於從文件打開對話框中選擇的文件類型的不同視圖。例如,如果選擇了* .txt文件,我將顯示MyCViewText,而如果選擇了* .jpg文件,則顯示MyCViewImage。

  3. 顯示文件擴展名文件打開對話框的自定義列表。例如,使用自定義對話框和過濾器,如:CFileDialog *dlg = new CFileDialog(TRUE, NULL, NULL, NULL, L"Text Files (*.txt)|*.txt|" L"JPEG Files (*.jpg)|*.jpg||");

但是,我有兩個問題。

首先,我不知道在哪裏插入File - > Open對話框的文件擴展名過濾器。如果我用自定義CFileDialog覆蓋CWinApp::OnFileOpen(),那麼我將失去SDI提供的所有幕後行爲,例如調用CDocument::OnDocumentOpen()調用並初始化文檔模板的CView。我無法在覆蓋中調用CWinApp::OnFileOpen(),因爲第一個文件打開對話框出現在第一個文件擴展名篩選器之後,並且沒有文件擴展名篩選器。

其次,從文件打開對話框中選擇文件後,我不知道在哪裏插入視圖切換代碼。文檔模板設置是這樣的:

pDocTemplate = new CSingleDocTemplate(
    IDR_MAINFRAME, 
    RUNTIME_CLASS(CMyAppDoc), 
    RUNTIME_CLASS(CMainFrame), 
    RUNTIME_CLASS(CMyCView)); 

好像我將要重寫CWinApp::OnFileOpen()和切換文檔模板視圖RUNTIME_CLASS(CMyCView),但我不知道這甚至有可能。

MFC SDI是否不符合我的三個要求?我必須使用MFC MDI應用程序嗎?如果我必須以某種方式使用MDI,那麼我將如何限制只在任何給定時間加載並顯示單個文檔?

任何幫助表示讚賞。

回答

2

在您的InitInstance函數,創建一個新的SingleDocTemplate並將其添加到模板的集合:

CSingleDocTemplate* pDocTemplate2; 
    pDocTemplate2 = new CSingleDocTemplate(IDR_MAINFRAME2, 
    RUNTIME_CLASS(CMyDoc2), 
    RUNTIME_CLASS(CMainFrame),  // main SDI frame window 
    RUNTIME_CLASS(CMyView2)); 
    if (!pDocTemplate2) 
    return FALSE; 

    AddDocTemplate(pDocTemplate2); 

文件類型和擴展雲在一個字符串表項。

IDR_MAINFRAME2 "MyCalc Windows Application\nSheet\nWorksheet\n Worksheets (*.myc)\n.myc\nMyCalcSheet\n MyCalc Worksheet" 

MFC將識別該模板,並將其作爲File-New或File-Open上的一個選項提供。根據您的要求,您可能需要爲CMyDoc2和CMyView2創建新類,或者如果可以使用原始類來處理任一種文件類型,則可能需要使用這些類。