基于文件扩展名的多视图MFC SDI

基于文件扩展名的多视图MFC SDI,mfc,file-extension,sdi,Mfc,File Extension,Sdi,我正试图构建一个具有以下要求的MFC SDI(单文档接口)应用程序: 一次只显示一个文档 支持基于从“文件打开”对话框中选择的文件类型的不同视图。例如,如果选择了*.txt文件,我将显示MyCViewText,而如果选择了*.jpg文件,我将显示MyCViewImage 显示文件扩展名的自定义列表“文件打开”对话框。例如,使用自定义对话框和过滤器,如:CFileDialog*dlg=newcfiledialog(TRUE、NULL、NULL、NULL、L“文本文件(*.txt)|*.txt |“

我正试图构建一个具有以下要求的MFC SDI(单文档接口)应用程序:

  • 一次只显示一个文档

  • 支持基于从“文件打开”对话框中选择的文件类型的不同视图。例如,如果选择了*.txt文件,我将显示MyCViewText,而如果选择了*.jpg文件,我将显示MyCViewImage

  • 显示文件扩展名的自定义列表“文件打开”对话框。例如,使用自定义对话框和过滤器,如:
    CFileDialog*dlg=newcfiledialog(TRUE、NULL、NULL、NULL、L“文本文件(*.txt)|*.txt |“L”JPEG文件(*.jpg)|*.jpg | |)

  • 但是,我有两个问题

    首先,我不知道在哪里插入文件->打开对话框的文件扩展名过滤器。如果我使用自定义的
    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()
    并切换文档模板视图运行时类(CMyCView),但我不确定这是否可行

    MFC SDI是否不适合我的三个要求?我是否必须改用MFC MDI应用程序?如果我必须以某种方式使用MDI,那么我将如何限制在任何给定时间仅加载和显示单个文档


    非常感谢您的帮助。

    在InitInstance函数中,创建一个新的SingleDoctTemplate并将其添加到模板集合中:

    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将识别模板,并将其作为文件新建或文件打开选项提供。根据您的要求,您可能需要为CMyDoc2和CMyView2创建新类,或者如果可以使原始类与任一文件类型一起使用,则可能需要使用原始类