1. 程式人生 > >MFC在單文件程式中新增最近開啟檔案.

MFC在單文件程式中新增最近開啟檔案.

預設的MFC單文件程式可以支援最近的檔案列表,但是它卻不一定是我們需要的,因此我在這裡總結出手動控制的方法,以備不時之需。

預設的最近檔案列表是通過MRU file list來實現的,它通過將最近開啟的檔案寫入登錄檔,然後讀取到選單上實現的。這一切預設都是通過開啟和儲存這些選單操作來實現。當你選擇一個列表時,就會呼叫相應的事件響應函式。

下面是預設的操作內容:

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

現在,我要實現的是在任何情況下新增自己的檔案到列表中,然後編寫自己的處理函式。方法很簡單,實現如下:

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);引數填入絕對路徑即可.