MFC多文档中的打开继承自CWinAppEx中的函数OnFileOpen(),这一点在CXXX.cpp中可以看到。比如如下:

[cpp] view plain copy
  1. // CCVMFCApp
  2. BEGIN_MESSAGE_MAP(CCVMFCApp, CWinAppEx)
  3. ON_COMMAND(ID_APP_ABOUT, &CCVMFCApp::OnAppAbout)
  4. // 基于文件的标准文档命令
  5. ON_COMMAND(ID_FILE_NEW, &CWinAppEx::OnFileNew)
  6. ON_COMMAND(ID_FILE_OPEN, &CWinAppEx::OnFileOpen)
  7. // 标准打印设置命令
  8. ON_COMMAND(ID_FILE_PRINT_SETUP, &CWinAppEx::OnFilePrintSetup)
  9. END_MESSAGE_MAP()

中的 ON_COMMAND(ID_FILE_OPEN, &CWinAppEx::OnFileOpen)

它默认的只能打开一个文档,那如果想打开多个文档肿么办呢?

这里给一个辅助类MutiOpenDocManager,代码如下:

MutiOpenDocManager.h:

[cpp] view plain copy
  1. // MutiOpenDocManager.h: interface for the CMutiOpenDocManager class.
  2. //
  3. //
  4. #if !defined(AFX_MUTIOPENDOCMANAGER_H__8E7F5957_C207_4C9E_BA92_979203C32025__INCLUDED_)
  5. #define AFX_MUTIOPENDOCMANAGER_H__8E7F5957_C207_4C9E_BA92_979203C32025__INCLUDED_
  6. #if _MSC_VER > 1000
  7. #pragma once
  8. #endif // _MSC_VER > 1000
  9. class CMutiOpenDocManager : public CDocManager
  10. {
  11. public:
  12. virtual BOOL DoPromptFileNames(CStringList& fileNames,UINT nIDSTitle,DWORD lFlags,BOOL bOpenFileDialog,CDocTemplate* pTemplate);
  13. virtual void OnFileOpen();
  14. CMutiOpenDocManager();
  15. virtual ~CMutiOpenDocManager();
  16. void AppendFilterSuffix(CString &filter, OPENFILENAME &ofn, CDocTemplate *pTemplate, CString *pstrDefaultExt);
  17. };
  18. #endif // !defined(AFX_MUTIOPENDOCMANAGER_H__8E7F5957_C207_4C9E_BA92_979203C32025__INCLUDED_)

MutiOpenDocManager.cpp:

[cpp] view plain copy
  1. // MutiOpenDocManager.cpp: implementation of the CMutiOpenDocManager class.
  2. //
  3. //
  4. #include "stdafx.h"
  5. #include "MutiOpenDocManager.h"
  6. #ifdef _DEBUG
  7. #undef THIS_FILE
  8. static char THIS_FILE[]=__FILE__;
  9. #define new DEBUG_NEW
  10. #endif
  11. //
  12. // Construction/Destruction
  13. //
  14. CMutiOpenDocManager::CMutiOpenDocManager()
  15. {
  16. }
  17. CMutiOpenDocManager::~CMutiOpenDocManager()
  18. {
  19. }
  20. void CMutiOpenDocManager::OnFileOpen()
  21. {
  22. CStringList newNames;
  23. if(!DoPromptFileNames(newNames,AFX_IDS_OPENFILE,OFN_HIDEREADONLY|OFN_FILEMUSTEXIST|OFN_ALLOWMULTISELECT,TRUE,NULL))
  24. return;
  25. POSITION pos=newNames.GetHeadPosition();
  26. while(pos)
  27. {
  28. CString newName=newNames.GetNext(pos);
  29. AfxGetApp()->OpenDocumentFile(newName);
  30. }
  31. }
  32. BOOL CMutiOpenDocManager::DoPromptFileNames(CStringList& fileNames, UINT nIDSTitle, DWORD lFlags, BOOL bOpenFileDialog, CDocTemplate *pTemplate)
  33. {
  34. CFileDialog dlgFile(bOpenFileDialog);
  35. CString title;
  36. VERIFY(title.LoadString(nIDSTitle));
  37. dlgFile.m_ofn.Flags |= lFlags;
  38. CString strFilter;
  39. CString strDefault;
  40. if (pTemplate != NULL)
  41. {
  42. ASSERT_VALID(pTemplate);
  43. AppendFilterSuffix(strFilter, dlgFile.m_ofn, pTemplate, &strDefault);
  44. }
  45. else
  46. {
  47. // do for all doc template
  48. POSITION pos = m_templateList.GetHeadPosition();
  49. BOOL bFirst = TRUE;
  50. while (pos != NULL)
  51. {
  52. CDocTemplate* pTemplate = (CDocTemplate*)m_templateList.GetNext(pos);
  53. AppendFilterSuffix(strFilter, dlgFile.m_ofn, pTemplate,
  54. bFirst ? &strDefault : NULL);
  55. bFirst = FALSE;
  56. }
  57. }
  58. // append the "*.*" all files filter
  59. CString allFilter;
  60. VERIFY(allFilter.LoadString(AFX_IDS_ALLFILTER));
  61. strFilter += allFilter;
  62. strFilter += (TCHAR)'\0';   // next string please
  63. #ifndef _MAC
  64. strFilter += _T("*.*");
  65. #else
  66. strFilter += _T("****");
  67. #endif
  68. strFilter += (TCHAR)'\0';   // last string
  69. dlgFile.m_ofn.nMaxCustFilter++;
  70. dlgFile.m_ofn.lpstrFilter = strFilter;
  71. #ifndef _MAC
  72. dlgFile.m_ofn.lpstrTitle = title;
  73. #else
  74. dlgFile.m_ofn.lpstrPrompt = title;
  75. #endif
  76. CString strFileNames;
  77. dlgFile.m_ofn.lpstrFile=strFileNames.GetBuffer(2048);
  78. dlgFile.m_ofn.nMaxFile=2048;
  79. BOOL bResult=dlgFile.DoModal()==IDOK?TRUE:FALSE;
  80. strFileNames.ReleaseBuffer();
  81. if(!bResult)
  82. return FALSE;//取消打开文件操作
  83. //将文件名拷贝到一个字符串列表中
  84. POSITION pos=dlgFile.GetStartPosition();
  85. while(pos)
  86. {
  87. fileNames.AddTail(dlgFile.GetNextPathName(pos));
  88. }
  89. return
  90. TRUE;
  91. }
  92. //下面的函数是DoPromptFileNames函数中需要调用的模块函数
  93. void CMutiOpenDocManager::AppendFilterSuffix(CString &filter, OPENFILENAME &ofn, CDocTemplate *pTemplate, CString *pstrDefaultExt)
  94. {
  95. ASSERT_VALID(pTemplate);
  96. ASSERT_KINDOF(CDocTemplate, pTemplate);
  97. CString strFilterExt, strFilterName;
  98. if (pTemplate->GetDocString(strFilterExt, CDocTemplate::filterExt) &&
  99. !strFilterExt.IsEmpty() &&
  100. pTemplate->GetDocString(strFilterName, CDocTemplate::filterName) &&
  101. !strFilterName.IsEmpty())
  102. {
  103. // a file based document template - add to filter list
  104. ASSERT(strFilterExt[0] == '.');
  105. if (pstrDefaultExt != NULL)
  106. {
  107. // set the default extension
  108. *pstrDefaultExt = ((LPCTSTR)strFilterExt) + 1;  // skip the '.'
  109. ofn.lpstrDefExt = (LPTSTR)(LPCTSTR)(*pstrDefaultExt);
  110. ofn.nFilterIndex = ofn.nMaxCustFilter + 1;  // 1 based number
  111. }
  112. // add to filter
  113. filter += strFilterName;
  114. ASSERT(!filter.IsEmpty());  // must have a file type name
  115. filter += (TCHAR)'\0';  // next string please
  116. filter += (TCHAR)'*';
  117. filter += strFilterExt;
  118. filter += (TCHAR)'\0';  // next string please
  119. ofn.nMaxCustFilter++;
  120. }
  121. }

然后再在CXXX.cpp的一个位置插入一句话!至关重要:

[cpp] view plain copy
  1. BOOL CCVMFCApp::InitInstance()
  2. {
  3. // 如果一个运行在 Windows XP 上的应用程序清单指定要
  4. // 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,
  5. //则需要 InitCommonControlsEx()。否则,将无法创建窗口。
  6. INITCOMMONCONTROLSEX InitCtrls;
  7. InitCtrls.dwSize = sizeof(InitCtrls);
  8. // 将它设置为包括所有要在应用程序中使用的
  9. // 公共控件类。
  10. InitCtrls.dwICC = ICC_WIN95_CLASSES;
  11. InitCommonControlsEx(&InitCtrls);
  12. CWinAppEx::InitInstance();
  13. // 初始化 OLE 库
  14. if (!AfxOleInit())
  15. {
  16. AfxMessageBox(IDP_OLE_INIT_FAILED);
  17. return FALSE;
  18. }
  19. AfxEnableControlContainer();
  20. // 标准初始化
  21. // 如果未使用这些功能并希望减小
  22. // 最终可执行文件的大小,则应移除下列
  23. // 不需要的特定初始化例程
  24. // 更改用于存储设置的注册表项
  25. // TODO: 应适当修改该字符串,
  26. // 例如修改为公司或组织名
  27. SetRegistryKey(_T("应用程序向导生成的本地应用程序"));
  28. LoadStdProfileSettings(4);  // 加载标准 INI 文件选项(包括 MRU)
  29. InitContextMenuManager();
  30. InitKeyboardManager();
  31. InitTooltipManager();
  32. CMFCToolTipInfo ttParams;
  33. ttParams.m_bVislManagerTheme = TRUE;
  34. theApp.GetTooltipManager()->SetTooltipParams(AFX_TOOLTIP_TYPE_ALL,
  35. RUNTIME_CLASS(CMFCToolTipCtrl), &ttParams);
  36. // 注册应用程序的文档模板。文档模板
  37. // 将用作文档、框架窗口和视图之间的连接
  38. CMultiDocTemplate* pDocTemplate;
  39. m_pDocManager = new CMutiOpenDocManager;//注意必须在此位置添加此句
  40. pDocTemplate = new CMultiDocTemplate(IDR_CVMFCTYPE,
  41. RUNTIME_CLASS(CCVMFCDoc),
  42. RUNTIME_CLASS(CChildFrame), // 自定义 MDI 子框架
  43. RUNTIME_CLASS(CCVMFCView));
  44. if (!pDocTemplate)
  45. return FALSE;
  46. AddDocTemplate(pDocTemplate);
  47. // 创建主 MDI 框架窗口
  48. CMainFrame* pMainFrame = new CMainFrame;
  49. if (!pMainFrame || !pMainFrame->LoadFrame(IDR_MAINFRAME))
  50. {
  51. delete pMainFrame;
  52. return FALSE;
  53. }
  54. m_pMainWnd = pMainFrame;
  55. // 仅当具有后缀时才调用 DragAcceptFiles
  56. //  在 MDI 应用程序中,这应在设置 m_pMainWnd 之后立即发生
  57. // 分析标准外壳命令、DDE、打开文件操作的命令行
  58. CCommandLineInfo cmdInfo;
  59. ParseCommandLine(cmdInfo);
  60. // 调度在命令行中指定的命令。如果
  61. // 用 /RegServer、/Register、/Unregserver 或 /Unregister 启动应用程序,则返回 FALSE。
  62. if (!ProcessShellCommand(cmdInfo))
  63. return FALSE;
  64. // 主窗口已初始化,因此显示它并对其进行更新
  65. pMainFrame->ShowWindow(m_nCmdShow);
  66. pMainFrame->UpdateWindow();
  67. return TRUE;
  68. }

注意45行的那句话,这是因为在创建类实例的时候将文档类定义为MutiOpenDocManager类,就可以使用其中的打开函数了。

当然,如果工程是对话框就更好办了,直接把onopen函数写成这样即可打开多个文档:

[cpp] view plain copy
  1. void CCFileDialogST_demoDlg::OnOpen()
  2. {
  3. CFileDialogST   dlg(TRUE, NULL, NULL, /*OFN_HIDEREADONLY | */OFN_OVERWRITEPROMPT | OFN_ALLOWMULTISELECT, _T("All files\0*.*\0"), this);
  4. CString         sPathName;
  5. int             nRetValue;
  6. nRetValue = dlg.DoModal();
  7. if (nRetValue == IDOK)
  8. {
  9. POSITION    Pos;
  10. Pos = dlg.GetStartPosition();
  11. while (Pos != NULL)
  12. {
  13. sPathName = dlg.GetNextPathName(Pos);
  14. MessageBox(sPathName, _T("GetNextPathName"), MB_ICONINFORMATION);
  15. }
  16. } // if
  17. } // End of OnOpen
from: http://blog.csdn.net/abcjennifer/article/details/7441354

MFC 多文档中同时打开多个文档相关推荐

  1. ubuntu中命令打开图片、文档、音乐、视频等

    ubuntu中命令打开图片.文档.音乐.视频等 安装播放软件 sudo apt install libdvdnav4 libdvdread4 gstreamer1.0-plugins-bad gstr ...

  2. 使用OpenXml打开word文档中嵌入的另一个文档

    今天在写字处理评分程序的时候遇到一个之前没有经历过的场景:在给定的字处理素材文档文档中嵌入了另一个字处理文档,题目要求既要对素材文档进行修改,也要对嵌入的文档进行格式调整.打开嵌入的文档对于操作者来说 ...

  3. VS中怎样打开MSDN帮助文档

    场景 在VS中进行编辑代码时,突然对某种语法或关键字等忘记. 这时可以借助MSDN官方文档来查看语法. 实现 比如要查看float的特征. 在vs中输入float,然后按F1键,会在默认浏览器上打开帮 ...

  4. python向文档中输入内容_python处理文档:把选择题的答案选项对应的内容填到选择题题目的括号里面输入的文本...

    需求:把选择题的答案选项对应的内容填到选择题题目的括号里面 输入的文本: 刑法的基本原则是指贯穿于刑法制定和实施全过程的根本性准则,我国刑法规定的刑法的基本原则有 (BCD ). A回避原则 B罪刑法 ...

  5. 微软文本检索_如何在Microsoft Word中引用其他文档中的文本

    微软文本检索 You probably have some text that you type often in your Word documents, such as addresses. In ...

  6. C#操作Word(五)——在Word文档中插入图片

    实例说明 在Word文档的使用过程中,我们可以轻松的向文档中插入图片信息,那么,怎样使用C#向Word文档中插入图片呢?本实例将会介绍一种方法,可以方便的实现上述功能.实例运行效果如图1所示.   图 ...

  7. Word的样式库在 选项卡中_如何使用word文档?word文档使用技巧教程?

    Word文档使用方法与教程: 使用正确的部分和章节标题 我们在前面的章节中介绍了预设样式,但是这些样式可用于快速创建章节,子标题和标题页.在"主页"功能区选项卡中找到样式,可以在其 ...

  8. 计算机中分页符号是什么,电脑word文档中分页符如何插入

    电脑word文档中分页符如何插入 腾讯视频/爱奇艺/优酷/外卖 充值4折起 我们在使用word文档办公的时候,有时需要使用到分页符,那么今天小编告诉大家的是电脑word文档中分页符如何插入. 具体如下 ...

  9. Python:批量读取目录下jpg文件,并输出jpg文件的绝对路径到指定txt文档中。

    #功能:读取jpg文件,输出绝对目录到txt中. import os.path import glob import os"""https://blog.csdn.net ...

最新文章

  1. from __future__ import print_function 介绍
  2. 返回指针_C语言面试中的问题指针和引用的使用场景?
  3. 网工视频13第13章.计算机系统开发运行与配置疑难问题
  4. 【Android studio快捷键】代码提示
  5. MAC安装Mysql超详细完整教程
  6. Linux操作系统(3.2.14find)
  7. ndows优化大师 免费版,Windows7优化大师
  8. electron开发客户端注意事项(兼开源个人知识管理工具“想学吗”)
  9. python画图旋转图形_python简单实现旋转图片的方法
  10. JAVA短期培训班多少钱?
  11. 手绘vs码绘 动态对比
  12. 【dp】LGTB 玩THD
  13. 使能树莓派无线上网和SSH登录
  14. win10计算机导航栏怎么删除,如何自定义导航栏?win10资源管理器导航栏删除多余选项的操作方法...
  15. 初探 Ettercap: ARP投毒 DNS欺骗
  16. 关于win10系统重启后图标自动排序问题的解决方案
  17. 内网攻防经典技术备忘录
  18. Gitlab CI/CD教程以及实战docker自动部署前端项目(全)
  19. 实现黑客帝国数字雨效果
  20. 一键锁屏源代码c语言,Android一键锁屏开发全过程【源码】【附图】

热门文章

  1. 数据分析:2020年3月汽车工业经济运行情况
  2. 4. Nest :module (Model)
  3. LambdaMART的源码分析:一(MART:回归树)
  4. 流行的就是最好的:Android开发者的职场规划
  5. GitHub是如何征服Google、微软和其它公司的
  6. OS - 计算机基本组成
  7. Spring MVC源码 - 00开篇主题框架一览
  8. Spring-AOP 静态正则表达式方法匹配切面
  9. Android开发工具新接触
  10. python练习题实例_Python 练习实例65