如何在CMFCRibbonBar中更新最近文件列表

How to update Recent File List in the CMFCRibbonBar

本文关键字:最近 文件 列表 更新 CMFCRibbonBar      更新时间:2023-10-16

我们已经用CMFCRibbonBar代替了vc++ VS2010的菜单应用程序。在旧的菜单驱动版本中,我们已经创建了自己的用户定义类,派生自CRecentFileList。我们覆盖了uoddatemenu方法,以便从Recent File List中添加和删除文件。现在我们正在使用CMFCRibbonBar,我们在功能区中更新Recent Files列表时遇到了问题。每次我们打开另一个文件时,MRU列表都会正确更新,但功能区中的Recent file列表保持不变。如果我们关闭应用程序,然后重新打开它,最近的文件列表被正确更新。任何帮助都将非常感激。谢谢你。

当您使用自己的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();
}

看看是否有帮助