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

时间:2013-02-02 14:18:16

标签: mfc file-extension 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||");

  4. 但是,我有两个问题。

    首先,我不知道在哪里插入文件的文件扩展名过滤器 - >打开对话框。如果我使用自定义CWinApp::OnFileOpen()覆盖CFileDialog,那么我将失去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,那么我将如何限制只在任何给定时间加载和显示单个文档?

    感谢任何帮助。

1 个答案:

答案 0 :(得分:3)

在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创建新类,或者如果可以使用原始类,则可以使用原始类。