2013-04-10 177 views
0

我們用CMFCRibbonBar替換了VC++ VS2010菜單應用程序。在舊的菜單驅動版本中,我們創建了自己的用戶定義的類派生自CRecentFileList。我們覆蓋了UodateMenu方法來添加和刪除最近文件列表中的文件。現在我們正在使用CMFCRibbonBar,我們在獲取功能區中更新的最近文件列表時遇到問題。每當我們打開另一個文件時,MRU列表都會正確更新,但功能區中的最近文件列表保持不變。如果我們關閉應用程序,然後重新打開它,則最近的文件列表已正確更新。任何幫助將不勝感激。謝謝。如何更新CMFCRibbonBar中的最近文件列表

回答

1

由於您已經使用了CRecentFileList自己的派生類,所以MFC的更改有一種可能影響了它的調用方式 - 特別是如果您更改了項目中的WINVER定義。

功能區欄不會完成通過MFC框架傳送文件/打開和文件/保存的命令,並且在每種情況下它們最終都會在CWinApp::AddToRecentFileList()的某個位置執行,這就是行爲。

現在,在早期版本的MFC(例如VS2008)的,該函數的定義如下:

void CWinApp::AddToRecentFileList(LPCTSTR lpszPathName) 
{ 
    ASSERT_VALID(this); 
    ENSURE_ARG(lpszPathName != NULL); 
    ASSERT(AfxIsValidString(lpszPathName)); 

    if (m_pRecentFileList != NULL) 
     m_pRecentFileList->Add(lpszPathName); 
} 

然而,(我認爲)VS2010起 - 當然是VS2012 - 該功能現在看起來是這樣:

void CWinApp::AddToRecentFileList(LPCTSTR lpszPathName) 
{ 
    ASSERT_VALID(this); 
    ENSURE_ARG(lpszPathName != NULL); 
    ASSERT(AfxIsValidString(lpszPathName)); 

    if (m_pRecentFileList != NULL) 
    { 
#if (WINVER >= 0x0601) 
     m_pRecentFileList->Add(lpszPathName, m_pszAppID); 
#else 
     m_pRecentFileList->Add(lpszPathName); 
#endif 
    } 
} 

你可以看到,有一種CRecentFileList::Add()一個新的重載這可能會影響您的派生類的邏輯。如果您使用調試器進入新代碼,您可以看到它使用Windows 7 shell API調用將最新文檔添加到跳轉列表中(除此之外),無論如何您都可能想要這樣做。

在任何情況下,正如您發現重新加載應用程序正確顯示更新列表,我認爲只需要在更改後自行重新加載列表。要做到這一點,你可以重寫CWinApp::AddToRecentFileList()如下:

void CYourApp::AddToRecentFileList(LPCTSTR lpszPathName) 
{ 
    CWinApp::AddToRecentFileList(lpszPathName); 
    m_pRecentFileList->ReadList(); 
} 

看看是否有幫助。