日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

MFC 多文档中同时打开多个文档

發布時間:2025/3/21 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MFC 多文档中同时打开多个文档 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

MFC多文檔中的打開繼承自CWinAppEx中的函數OnFileOpen(),這一點在CXXX.cpp中可以看到。比如如下:

[cpp]?view plain?copy
  • //?CCVMFCApp??
  • ??
  • BEGIN_MESSAGE_MAP(CCVMFCApp,?CWinAppEx)??
  • ????ON_COMMAND(ID_APP_ABOUT,?&CCVMFCApp::OnAppAbout)??
  • ????//?基于文件的標準文檔命令??
  • ????ON_COMMAND(ID_FILE_NEW,?&CWinAppEx::OnFileNew)??
  • ????ON_COMMAND(ID_FILE_OPEN,?&CWinAppEx::OnFileOpen)??
  • ????//?標準打印設置命令??
  • ????ON_COMMAND(ID_FILE_PRINT_SETUP,?&CWinAppEx::OnFilePrintSetup)??
  • END_MESSAGE_MAP()??

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

    它默認的只能打開一個文檔,那如果想打開多個文檔腫么辦呢?

    這里給一個輔助類MutiOpenDocManager,代碼如下:

    MutiOpenDocManager.h:

    [cpp]?view plain?copy
  • //?MutiOpenDocManager.h:?interface?for?the?CMutiOpenDocManager?class.??
  • //??
  • //??
  • ??
  • #if?!defined(AFX_MUTIOPENDOCMANAGER_H__8E7F5957_C207_4C9E_BA92_979203C32025__INCLUDED_)??
  • #define?AFX_MUTIOPENDOCMANAGER_H__8E7F5957_C207_4C9E_BA92_979203C32025__INCLUDED_??
  • ??
  • #if?_MSC_VER?>?1000??
  • #pragma?once??
  • #endif?//?_MSC_VER?>?1000??
  • ??
  • class?CMutiOpenDocManager?:?public?CDocManager????
  • {??
  • public:??
  • ????virtual?BOOL?DoPromptFileNames(CStringList&?fileNames,UINT?nIDSTitle,DWORD?lFlags,BOOL?bOpenFileDialog,CDocTemplate*?pTemplate);??
  • ????virtual?void?OnFileOpen();??
  • ????CMutiOpenDocManager();??
  • ????virtual?~CMutiOpenDocManager();??
  • ????void?AppendFilterSuffix(CString?&filter,?OPENFILENAME?&ofn,?CDocTemplate?*pTemplate,?CString?*pstrDefaultExt);??
  • ??
  • };??
  • ??
  • #endif?//?!defined(AFX_MUTIOPENDOCMANAGER_H__8E7F5957_C207_4C9E_BA92_979203C32025__INCLUDED_)??

  • MutiOpenDocManager.cpp:

    [cpp]?view plain?copy
  • //?MutiOpenDocManager.cpp:?implementation?of?the?CMutiOpenDocManager?class.??
  • //??
  • //??
  • ??
  • #include?"stdafx.h"??
  • #include?"MutiOpenDocManager.h"??
  • ??
  • #ifdef?_DEBUG??
  • #undef?THIS_FILE??
  • static?char?THIS_FILE[]=__FILE__;??
  • #define?new?DEBUG_NEW??
  • #endif??
  • ??
  • //??
  • //?Construction/Destruction??
  • //??
  • ??
  • CMutiOpenDocManager::CMutiOpenDocManager()??
  • {??
  • ??
  • }??
  • ??
  • CMutiOpenDocManager::~CMutiOpenDocManager()??
  • {??
  • ??
  • }??
  • ??
  • void?CMutiOpenDocManager::OnFileOpen()??
  • {??
  • ????CStringList?newNames;??
  • ????if(!DoPromptFileNames(newNames,AFX_IDS_OPENFILE,OFN_HIDEREADONLY|OFN_FILEMUSTEXIST|OFN_ALLOWMULTISELECT,TRUE,NULL))??
  • ????????return;??
  • ????POSITION?pos=newNames.GetHeadPosition();??
  • ????while(pos)??
  • ????{??
  • ????????CString?newName=newNames.GetNext(pos);??
  • ????????AfxGetApp()->OpenDocumentFile(newName);??
  • ????}??
  • ??
  • }??
  • ??
  • BOOL?CMutiOpenDocManager::DoPromptFileNames(CStringList&?fileNames,?UINT?nIDSTitle,?DWORD?lFlags,?BOOL?bOpenFileDialog,?CDocTemplate?*pTemplate)??
  • {??
  • ????CFileDialog?dlgFile(bOpenFileDialog);??
  • ??
  • ????CString?title;??
  • ????VERIFY(title.LoadString(nIDSTitle));??
  • ??
  • ????dlgFile.m_ofn.Flags?|=?lFlags;??
  • ??
  • ????CString?strFilter;??
  • ????CString?strDefault;??
  • ????if?(pTemplate?!=?NULL)??
  • ????{??
  • ????????ASSERT_VALID(pTemplate);??
  • ????????AppendFilterSuffix(strFilter,?dlgFile.m_ofn,?pTemplate,?&strDefault);??
  • ????}??
  • ????else??
  • ????{??
  • ????????//?do?for?all?doc?template??
  • ????????POSITION?pos?=?m_templateList.GetHeadPosition();??
  • ????????BOOL?bFirst?=?TRUE;??
  • ????????while?(pos?!=?NULL)??
  • ????????{??
  • ????????????CDocTemplate*?pTemplate?=?(CDocTemplate*)m_templateList.GetNext(pos);??
  • ????????????AppendFilterSuffix(strFilter,?dlgFile.m_ofn,?pTemplate,??
  • ????????????????bFirst???&strDefault?:?NULL);??
  • ????????????bFirst?=?FALSE;??
  • ????????}??
  • ????}??
  • ??
  • ????//?append?the?"*.*"?all?files?filter??
  • ????CString?allFilter;??
  • ????VERIFY(allFilter.LoadString(AFX_IDS_ALLFILTER));??
  • ????strFilter?+=?allFilter;??
  • ????strFilter?+=?(TCHAR)'\0';???//?next?string?please??
  • ????#ifndef?_MAC??
  • ????strFilter?+=?_T("*.*");??
  • ????#else??
  • ????strFilter?+=?_T("****");??
  • ????#endif??
  • ????strFilter?+=?(TCHAR)'\0';???//?last?string??
  • ????dlgFile.m_ofn.nMaxCustFilter++;??
  • ????dlgFile.m_ofn.lpstrFilter?=?strFilter;??
  • ??
  • ????#ifndef?_MAC??
  • ????dlgFile.m_ofn.lpstrTitle?=?title;??
  • ????#else??
  • ????dlgFile.m_ofn.lpstrPrompt?=?title;??
  • ????#endif??
  • ??
  • ????CString?strFileNames;??
  • ????dlgFile.m_ofn.lpstrFile=strFileNames.GetBuffer(2048);??
  • ????dlgFile.m_ofn.nMaxFile=2048;??
  • ????BOOL?bResult=dlgFile.DoModal()==IDOK?TRUE:FALSE;??
  • ????strFileNames.ReleaseBuffer();??
  • ????if(!bResult)??
  • ????????return?FALSE;//取消打開文件操作??
  • ????//將文件名拷貝到一個字符串列表中??
  • ????POSITION?pos=dlgFile.GetStartPosition();??
  • ????while(pos)??
  • ????{??
  • ????????fileNames.AddTail(dlgFile.GetNextPathName(pos));??
  • ????}??
  • ????return??
  • ????????TRUE;??
  • }??
  • ??
  • //下面的函數是DoPromptFileNames函數中需要調用的模塊函數??
  • void?CMutiOpenDocManager::AppendFilterSuffix(CString?&filter,?OPENFILENAME?&ofn,?CDocTemplate?*pTemplate,?CString?*pstrDefaultExt)??
  • {??
  • ????ASSERT_VALID(pTemplate);??
  • ????ASSERT_KINDOF(CDocTemplate,?pTemplate);??
  • ??
  • ????CString?strFilterExt,?strFilterName;??
  • ????if?(pTemplate->GetDocString(strFilterExt,?CDocTemplate::filterExt)?&&??
  • ?????!strFilterExt.IsEmpty()?&&??
  • ?????pTemplate->GetDocString(strFilterName,?CDocTemplate::filterName)?&&??
  • ?????!strFilterName.IsEmpty())??
  • ????{??
  • ????????//?a?file?based?document?template?-?add?to?filter?list??
  • ????????ASSERT(strFilterExt[0]?==?'.');??
  • ????????if?(pstrDefaultExt?!=?NULL)??
  • ????????{??
  • ????????????//?set?the?default?extension??
  • ????????????*pstrDefaultExt?=?((LPCTSTR)strFilterExt)?+?1;??//?skip?the?'.'??
  • ????????????ofn.lpstrDefExt?=?(LPTSTR)(LPCTSTR)(*pstrDefaultExt);??
  • ????????????ofn.nFilterIndex?=?ofn.nMaxCustFilter?+?1;??//?1?based?number??
  • ????????}??
  • ??
  • ????????//?add?to?filter??
  • ????????filter?+=?strFilterName;??
  • ????????ASSERT(!filter.IsEmpty());??//?must?have?a?file?type?name??
  • ????????filter?+=?(TCHAR)'\0';??//?next?string?please??
  • ????????filter?+=?(TCHAR)'*';??
  • ????????filter?+=?strFilterExt;??
  • ????????filter?+=?(TCHAR)'\0';??//?next?string?please??
  • ????????ofn.nMaxCustFilter++;??
  • ????}??
  • }??

  • 然后再在CXXX.cpp的一個位置插入一句話!至關重要:

    [cpp]?view plain?copy
  • BOOL?CCVMFCApp::InitInstance()??
  • {??
  • ????//?如果一個運行在?Windows?XP?上的應用程序清單指定要??
  • ????//?使用?ComCtl32.dll?版本?6?或更高版本來啟用可視化方式,??
  • ????//則需要?InitCommonControlsEx()。否則,將無法創建窗口。??
  • ????INITCOMMONCONTROLSEX?InitCtrls;??
  • ????InitCtrls.dwSize?=?sizeof(InitCtrls);??
  • ????//?將它設置為包括所有要在應用程序中使用的??
  • ????//?公共控件類。??
  • ????InitCtrls.dwICC?=?ICC_WIN95_CLASSES;??
  • ????InitCommonControlsEx(&InitCtrls);??
  • ??
  • ????CWinAppEx::InitInstance();??
  • ??
  • ????//?初始化?OLE?庫??
  • ????if?(!AfxOleInit())??
  • ????{??
  • ????????AfxMessageBox(IDP_OLE_INIT_FAILED);??
  • ????????return?FALSE;??
  • ????}??
  • ????AfxEnableControlContainer();??
  • ????//?標準初始化??
  • ????//?如果未使用這些功能并希望減小??
  • ????//?最終可執行文件的大小,則應移除下列??
  • ????//?不需要的特定初始化例程??
  • ????//?更改用于存儲設置的注冊表項??
  • ????//?TODO:?應適當修改該字符串,??
  • ????//?例如修改為公司或組織名??
  • ????SetRegistryKey(_T("應用程序向導生成的本地應用程序"));??
  • ????LoadStdProfileSettings(4);??//?加載標準?INI?文件選項(包括?MRU)??
  • ??
  • ????InitContextMenuManager();??
  • ??
  • ????InitKeyboardManager();??
  • ??
  • ????InitTooltipManager();??
  • ????CMFCToolTipInfo?ttParams;??
  • ????ttParams.m_bVislManagerTheme?=?TRUE;??
  • ????theApp.GetTooltipManager()->SetTooltipParams(AFX_TOOLTIP_TYPE_ALL,??
  • ????????RUNTIME_CLASS(CMFCToolTipCtrl),?&ttParams);??
  • ??
  • ????//?注冊應用程序的文檔模板。文檔模板??
  • ????//?將用作文檔、框架窗口和視圖之間的連接??
  • ????CMultiDocTemplate*?pDocTemplate;??
  • ????m_pDocManager?=?new?CMutiOpenDocManager;//注意必須在此位置添加此句??
  • ??
  • ????pDocTemplate?=?new?CMultiDocTemplate(IDR_CVMFCTYPE,??
  • ????????RUNTIME_CLASS(CCVMFCDoc),??
  • ????????RUNTIME_CLASS(CChildFrame),?//?自定義?MDI?子框架??
  • ????????RUNTIME_CLASS(CCVMFCView));??
  • ????if?(!pDocTemplate)??
  • ????????return?FALSE;??
  • ????AddDocTemplate(pDocTemplate);??
  • ??
  • ????//?創建主?MDI?框架窗口??
  • ????CMainFrame*?pMainFrame?=?new?CMainFrame;??
  • ????if?(!pMainFrame?||?!pMainFrame->LoadFrame(IDR_MAINFRAME))??
  • ????{??
  • ????????delete?pMainFrame;??
  • ????????return?FALSE;??
  • ????}??
  • ????m_pMainWnd?=?pMainFrame;??
  • ????//?僅當具有后綴時才調用?DragAcceptFiles??
  • ????//??在?MDI?應用程序中,這應在設置?m_pMainWnd?之后立即發生??
  • ??
  • ??
  • ????//?分析標準外殼命令、DDE、打開文件操作的命令行??
  • ????CCommandLineInfo?cmdInfo;??
  • ????ParseCommandLine(cmdInfo);??
  • ??
  • ??
  • ????//?調度在命令行中指定的命令。如果??
  • ????//?用?/RegServer、/Register、/Unregserver?或?/Unregister?啟動應用程序,則返回?FALSE。??
  • ????if?(!ProcessShellCommand(cmdInfo))??
  • ????????return?FALSE;??
  • ????//?主窗口已初始化,因此顯示它并對其進行更新??
  • ????pMainFrame->ShowWindow(m_nCmdShow);??
  • ????pMainFrame->UpdateWindow();??
  • ??
  • ????return?TRUE;??
  • }??

  • 注意45行的那句話,這是因為在創建類實例的時候將文檔類定義為MutiOpenDocManager類,就可以使用其中的打開函數了。



    當然,如果工程是對話框就更好辦了,直接把onopen函數寫成這樣即可打開多個文檔:

    [cpp]?view plain?copy
  • void?CCFileDialogST_demoDlg::OnOpen()???
  • {??
  • ????CFileDialogST???dlg(TRUE,?NULL,?NULL,?/*OFN_HIDEREADONLY?|?*/OFN_OVERWRITEPROMPT?|?OFN_ALLOWMULTISELECT,?_T("All?files\0*.*\0"),?this);??
  • ????CString?????????sPathName;??
  • ????int?????????????nRetValue;??
  • ??
  • ????nRetValue?=?dlg.DoModal();??
  • ????if?(nRetValue?==?IDOK)??
  • ????{??
  • ????????POSITION????Pos;??
  • ??
  • ????????Pos?=?dlg.GetStartPosition();??
  • ????????while?(Pos?!=?NULL)??
  • ????????{??
  • ????????????sPathName?=?dlg.GetNextPathName(Pos);??
  • ????????????MessageBox(sPathName,?_T("GetNextPathName"),?MB_ICONINFORMATION);??
  • ????????}???
  • ????}?//?if??
  • }?//?End?of?OnOpen??
  • from:?http://blog.csdn.net/abcjennifer/article/details/7441354

    總結

    以上是生活随笔為你收集整理的MFC 多文档中同时打开多个文档的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。