1

我正在尝试构建具有以下要求的 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 对话框插入文件扩展名过滤器。如果我CWinApp::OnFileOpen()使用 custom覆盖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,那么我将如何限制在任何给定时间仅加载和显示一个文档?

任何帮助表示赞赏。

4

1 回答 1

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

于 2013-02-03T20:48:56.410 回答