0

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

4

1 回答 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 回答