2013-02-02 55 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创建新类,或者如果可以使用原始类来处理任一种文件类型,则可能需要使用这些类。