【问题标题】:MFC SDI with multiple views based on file extension基于文件扩展名的具有多个视图的 MFC SDI
【发布时间】:2013-01-17 17:44:38
【问题描述】:

我正在尝试构建具有以下要求的 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,那么我将如何限制在任何给定时间仅加载和显示一个文档?

感谢任何帮助。

【问题讨论】:

    标签: mfc file-extension sdi


    【解决方案1】:

    在您的 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 创建新类,或者如果可以使它们适用于任一文件类型,则可能使用原始类。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-11
      • 2020-07-20
      • 1970-01-01
      • 1970-01-01
      • 2013-07-25
      • 1970-01-01
      • 2018-11-08
      • 2011-04-02
      相关资源
      最近更新 更多