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