首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

VC 多重 MRU 選單實現:分離工作區與檔案最近使用清單

     編輯:關於VC++

預設 MFC 僅支援單一 MRU(Most Recently Used)清單。若需像 Visual Studio 區分「最近工作區」與「最近檔案」兩類清單,需擴充 CRecentFileList 機制。本文提供完整實作步驟與程式碼範例。

核心實作八步驟

  1. 自訂選單 ID:資源編輯器新增 ID_FILE_MRU_MYFILE1 起始 ID,字串表同步新增 ID_FILE_MRU_MYFILE2...ID_FILE_MRU_MYFILE##
  2. 應用程式類別新增成員:CRecentFileList* m_pRecentListMyFiles;
  3. InitInstance 初始化:
    m_pRecentListMyFiles = new CRecentFileList(5, "My Recent File List", "MyFile%d", 5);
    m_pRecentListMyFiles->ReadList();
  4. ExitInstance 寫入存檔:m_pRecentListMyFiles->WriteList();
  5. UI 更新處理:ON_UPDATE_COMMAND_UI(ID_FILE_MRU_MYFILE1, OnUpdateMyFileMenu) 中呼叫 m_pRecentListMyFiles->UpdateMenu(pCmdUI);
  6. 命令範圍對應:訊息對應表加入 ON_COMMAND_EX_RANGE(ID_FILE_MRU_MYFILE1, ID_FILE_MRU_MYFILE##, OnOpenRecentMyFile)
  7. 命令處理函數:
    BOOL CMyApp::OnOpenRecentMyFile(UINT nID) {
        int nIndex = nID - ID_FILE_MRU_MYFILE1;
        if (OpenDocumentFile((*m_pRecentListMyFiles)[nIndex]) == NULL)
            m_pRecentListMyFiles->Remove(nIndex);
        return TRUE;
    }
  8. 重載 AddToRecentFileList 依副檔名分流:
    void Ck2App::AddToRecentFileList(LPCTSTR lpszPathName) {
        CString strExt, strPathName = lpszPathName;
        int nPos = strPathName.ReverseFind('.');
        if (nPos != -1) strExt = strPathName.Mid(nPos + 1);
        
        if (strExt.CompareNoCase("XXX") == 0) {  // 特定副檔名
            if (m_pRecentListMyFiles != NULL) {
                TCHAR szTemp[_MAX_PATH];
                AfxFullPath(szTemp, lpszPathName);
                m_pRecentListMyFiles->Add(szTemp);
            }
        } else {
            CWinApp::AddToRecentFileList(lpszPathName);  // 預設 MRU
        }
    }
  9. 解構函數釋放記憶體:delete m_pRecentListMyFiles;

關鍵設計重點

  • 保留預設 CRecentFileList 處理一般檔案,新增第二個實例處理特定類型
  • 利用 ON_COMMAND_EX_RANGE 處理動態選單項目命令
  • AfxFullPath 確保儲存完整路徑,避免相對路徑問題
  • 開啟失敗時自動從清單移除,維持清單有效性

擴充建議

  • 支援多種副檔名分類:以 std::map<CString, CRecentFileList*> 管理多個清單
  • 加入清單項目上限設定為可配置選項
  • 提供清單匯入/匯出功能

總結

透過繼承 MFC 文件/視圖架構的 MRU 機制,僅需少量程式碼即可實現多重最近使用清單分離,完美解決 Visual Studio 風格的工作區/檔案分類需求。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved