MFC在單文件程式中新增最近開啟檔案.
預設的MFC單文件程式可以支援最近的檔案列表,但是它卻不一定是我們需要的,因此我在這裡總結出手動控制的方法,以備不時之需。
預設的最近檔案列表是通過MRU file list來實現的,它通過將最近開啟的檔案寫入登錄檔,然後讀取到選單上實現的。這一切預設都是通過開啟和儲存這些選單操作來實現。當你選擇一個列表時,就會呼叫相應的事件響應函式。
下面是預設的操作內容:
- BOOL CWinApp::OnOpenRecentFile(UINT nID)
- {
- ASSERT_VALID(this);
- ASSERT(m_pRecentFileList != NULL);
- ASSERT(nID >= ID_FILE_MRU_FILE1);
- ASSERT(nID < ID_FILE_MRU_FILE1 + (UINT)m_pRecentFileList->GetSize());
- int nIndex = nID - ID_FILE_MRU_FILE1;
- ASSERT((*m_pRecentFileList)[nIndex].GetLength() != 0);
- TRACE2("MRU: open file (%d) '%s'.\n", (nIndex) + 1,
- (LPCTSTR)(*m_pRecentFileList)[nIndex]);
- if (OpenDocumentFile((*m_pRecentFileList)[nIndex]) == NULL)
- m_pRecentFileList->Remove(nIndex);
- return TRUE;
- }
現在,我要實現的是在任何情況下新增自己的檔案到列表中,然後編寫自己的處理函式。方法很簡單,實現如下:
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);引數填入絕對路徑即可.