MFC在单文档程序中添加最近打开文件.

转载 2012年05月27日 17:26:51

默认的MFC单文档程序可以支持最近的文件列表,但是它却不一定是我们需要的,因此我在这里总结出手动控制的方法,以备不时之需。

默认的最近文件列表是通过MRU file list来实现的,它通过将最近打开的文件写入注册表,然后读取到菜单上实现的。这一切默认都是通过打开和保存这些菜单操作来实现。当你选择一个列表时,就会调用相应的事件响应函数。

下面是默认的操作内容:

  1. BOOL CWinApp::OnOpenRecentFile(UINT nID)   
  2. {   
  3.          ASSERT_VALID(this);   
  4.          ASSERT(m_pRecentFileList != NULL);   
  5.      
  6.          ASSERT(nID >= ID_FILE_MRU_FILE1);   
  7.          ASSERT(nID < ID_FILE_MRU_FILE1 + (UINT)m_pRecentFileList->GetSize());   
  8.         int nIndex = nID - ID_FILE_MRU_FILE1;   
  9.          ASSERT((*m_pRecentFileList)[nIndex].GetLength() != 0);   
  10.      
  11.          TRACE2("MRU: open file (%d) '%s'.\n", (nIndex) + 1,   
  12.                          (LPCTSTR)(*m_pRecentFileList)[nIndex]);   
  13.      
  14.         if (OpenDocumentFile((*m_pRecentFileList)[nIndex]) == NULL)   
  15.                  m_pRecentFileList->Remove(nIndex);   
  16.      
  17.         return TRUE;   
  18. }

现在,我要实现的是在任何情况下添加自己的文件到列表中,然后编写自己的处理函数。方法很简单,实现如下:

1.首先,在想添加文件路径的地方添加代码

theApp.AddToRecentFileList(fileName);

theApp是应用程序对象,可以通过AfxGetApp获得它的对象指针。这样就会在菜单上添加fileName的最近文件列表,注意最好是全路径名,否则下面打开操作可能会有问题。

2.然后就是重载应用程序的OpenDocumentFile操作

在你点击最近文件列表后,就会调用程序的OpenDocumentFile函数,所以在此函数中添加自己代码即可。

在CApp类中添加该虚函数后,自动创建的函数里面有一句话return CWinApp::OpenDocumentFile(lpszFileName);

不做任何操作的话,会调用前面的OnOpenRecentFile函数,然后执行默认的操作。如果你的应用程序不支持文档操作的话,此函数就会执行失败。因此要添加自己的代码。

CDocument* CWavEditFormApp::OpenDocumentFile(LPCTSTR lpszFileName) 
{
//返回null会删除当前记录,返回当前文档则不做文档处理   
CFileFind finder;
if(finder.FindFile(lpszFileName))
{

//自己的处理代码


   return ((CFrameWnd *)this->m_pMainWnd)->GetActiveView()->GetDocument();
}
else
{
   MessageBox(NULL,_T("文件不存在!"),_T("文件打开错误"),MB_OK);
   return NULL;
}
// return CWinApp::OpenDocumentFile(lpszFileName);
}

上面的代码,首先检测该文件是否存在,不存在返回NULL,这样就会删除当前记录。存在的话就执行自己的代码,然后返回以前的文档,由于返回的是以前的文档,因此不会再有对文档的操作了。

通过上面2步后,你就能自己添加最近列表然后自己处理点击最近列表的处理函数了。



其它说明:

1. 主菜单的文件菜单下要有一个菜单ID为 ID_FILE_MRU_FILE1

2. 在BOOL CXXXApp::InitInstance()函数中,要使用以上语句,加载最近文件列表及其它配置信息

LoadStdProfileSettings(6); (参数中值6表示使用只记录6个最近文件,可以根据自己需求修改数量)

3.如果在如下重载函数中要注意:

CDocument* CWavEditFormApp::OpenDocumentFile(LPCTSTR lpszFileName) 

不能 return CWinApp::OpenDocumentFile(lpszFileName). 如果这样使用了,有时就会出现提示 contains an incorrect path的错误.原因还未知.

4. 在保存文件或者打开文件的时候记得调用AfxGetApp()->AddToRecentFileList(m_strFileName);参数填入绝对路径即可.


最近打开文件列表

afx_msg BOOL OnOpenRecentFile(UINT nID); 消息映射: ON_UPDATE_COMMAND_UI(ID_FILE_MRU_FILE1, OnUpd...

MFC实现最近文件列表简介

最近文件列表可以让你很方便地打开你以前曾经打开过的文件,那么,如何为自己的应用程序加入最近文件列表功能呢?1 方法1.1方法1:在你新建工程的时候选择包含最近文件列表功能,也就是在 MFC AppWi...

MFC——文件打开和保存对话框(CFileDialog)

最近要做一个文件打开和保存的对话框,现将相关的代码记录如下,用以备忘! 所用控件: 2个静态标签(Static Text):用以显示功能标签; 2个文本框(Edit):用以显示打开的文件路径全名要保存...
  • luoweifu
  • luoweifu
  • 2014年04月28日 22:42
  • 52790

MFC实现文件打开和保存功能实现

在大多数软件中,都有“打开”和“保存”这两个功能,以“记事本为打开功能”为例,其打开对话画框的界面如下: 其保存对画框,与打开对话框界面基本一样,下面也给程序增加这样的对话框,我们可以使用MFC提...

MFC打开文件的方法汇总

开发环境:Visual Studio 2012 1 Dialog框程序     基于对话框的MFC程序,可以创建一个button控件,然后在其事件函数里面使用文件对话框类CFileDialog实现文件...

MFC实现 打开文件、保存文件

CString folderName; CFileDialog hFileDlg(TRUE, _T("ini"), _T(""), OFN_OVERWRITEPROMPT | OFN_HIDEREA...

vs2013 MFC打开文件或文件夹对话框(有图有真相)

vs2013环境要求比vc6.0严格些。以前的代码不能直接拿来用,做了些修改。有效果图。...

MFC打开文件

建立对话框,创建一个Button控件,在单击

MFC中CFileDialog打开和保存文件对话框

     打开/保存文件对话框的程序:          CString   FilePathName;//文件名参数定义     CFileDialog  Dlg(TRUE,NULL,N...

MFC 单文档添加ListView方法片段

先建立MFC类listviewtest并继承CListView 然后重写OnInitialUpdate() void ShowListView::OnInitialUpdate() { CListV...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:MFC在单文档程序中添加最近打开文件.
举报原因:
原因补充:

(最多只允许输入30个字)