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

时间:2013-04-10 13:30:48

标签: c++ mfc recent-file-list

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

1 个答案:

答案 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();
}

看看是否有帮助。