gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 07:40:28 25 4
gpt4 key购买 nike

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

最佳答案

由于您使用了来自 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();
}

看看是否有帮助。

关于c++ - 如何更新 CMFCRibbonBar 中的最近文件列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15927293/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com