在 MFC 對話框應用程式中,每次打開檔案後自動記錄到「文件」選單底部,用戶點選即可快速重新打開,類似記事本的「最近使用檔案」功能。
CRecentFileList 類(MFC 內建)管理最近檔案清單,自動處理註冊表讀寫與 MRU (Most Recently Used) 邏輯。CWinApp::InitInstance() 中建立實例:m_pRecentFileList = new CRecentFileList(
NULL, // 無自定義存取器
_T("Recent Files"), // 註冊表鍵值名
_T("File%d"), // 註冊表值名格式
4, // 最大記錄數
ID_FILE_MRU_FILE1 // 起始命令 ID
);
void CMyDialog::OnFileOpen()
{
CFileDialog dlg(TRUE);
if (dlg.DoModal() == IDOK) {
CString path = dlg.GetPathName();
if (OpenMyFile(path)) { // 自定義打開邏輯
AfxGetApp()->m_pRecentFileList->Add(path); // 關鍵步驟
}
}
}
ID_FILE_MRU_FILE1 到 ID_FILE_MRU_FILE4 命令,在 ON_COMMAND_RANGE 中處理:BEGIN_MESSAGE_MAP(CMyApp, CWinApp)
ON_COMMAND_RANGE(ID_FILE_MRU_FILE1, ID_FILE_MRU_FILE4, OnOpenRecentFile)
END_MESSAGE_MAP()
void CMyApp::OnOpenRecentFile(UINT nID)
{
int index = nID - ID_FILE_MRU_FILE1;
CString path = m_pRecentFileList->GetDisplayName(index, NULL);
if (!path.IsEmpty()) {
// 找到主視窗並發送打開命令,或直接調用打開邏輯
CMainFrame* pFrame = (CMainFrame*)m_pMainWnd;
pFrame->OpenFile(path);
}
}
若不想用資源編輯器,可動態建立選單項:
CMenu* pFileMenu = GetMenu()->GetSubMenu(0); // 假設文件選單是第0個
pFileMenu->AppendMenu(MF_SEPARATOR);
for (int i = 0; i < m_pRecentFileList->GetSize(); i++) {
CString name = m_pRecentFileList->GetDisplayName(i);
if (!name.IsEmpty())
pFileMenu->AppendMenu(MF_STRING, ID_FILE_MRU_FILE1 + i, name);
}