我正在尝试构建具有以下要求的MFC SDI(单文档界面)应用程序:
一次只显示一个文档。
根据从文件打开对话框中选择的文件类型支持不同的视图。例如,如果选择* .txt文件,我会显示MyCViewText,而如果选择了* .jpg文件,我会显示MyCViewImage。
显示文件扩展名文件打开对话框的自定义列表。例如,使用自定义对话框和过滤器,如:CFileDialog *dlg = new CFileDialog(TRUE, NULL, NULL, NULL, L"Text Files (*.txt)|*.txt|" L"JPEG Files (*.jpg)|*.jpg||");
但是,我有两个问题。
首先,我不知道在哪里插入文件的文件扩展名过滤器 - >打开对话框。如果我使用自定义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,那么我将如何限制只在任何给定时间加载和显示单个文档?
感谢任何帮助。
答案 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创建新类,或者如果可以使用原始类,则可以使用原始类。