我们用CMFCRibbonBar替换了VC ++ VS2010菜单应用程序。在较旧的菜单驱动版本中,我们创建了自己的用户定义类,派生自CRecentFileList。我们覆盖UodateMenu方法以添加和删除最近文件列表中的文件。现在我们正在使用CMFCRibbonBar,我们在使用功能区中更新Recent Files列表时遇到问题。每次打开另一个文件时,MRU列表都会正确更新,但功能区中的“最近文件”列表保持不变。如果我们关闭应用程序,然后重新打开它,最近文件列表会正确更新。任何帮助将非常感激。谢谢。
答案 0 :(得分: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();
}
看看是否有帮助。