Мы заменили приложение меню VC ++ VS2010 на CMFCRibbonBar. В более старой версии, управляемой меню, мы создали собственный определяемый пользователем класс, производный от CRecentFileList. Мы переопределили метод UodateMenu для добавления и удаления файлов из списка последних файлов. Теперь, когда мы используем CMFCRibbonBar, у нас возникают проблемы с обновлением списка последних файлов на ленте. список MRU корректно обновляется каждый раз, когда мы открываем другой файл, но список последних файлов на ленте остается прежним. Если мы закроем приложение, а затем снова откроем его, список последних файлов обновляется должным образом. Любая помощь будет чрезвычайно ценится. Спасибо.
Как вы использовали свой собственный производный класс от CRecentFileList
есть одна возможность, что изменения в MFC повлияли на то, как он называется — в частности, если вы изменили WINVER
определение в вашем проекте.
Ленточная панель не делает ничего, кроме маршрутизации команд для File / Open и File / Save через инфраструктуру 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()
что может повлиять на логику в вашем производном классе. Если вы войдете в этот новый код с помощью отладчика, вы увидите, что он использует вызовы API оболочки Windows 7 для добавления последних документов в список переходов (среди прочего), что вы можете захотеть сделать в любом случае.
В любом случае, поскольку вы обнаружили, что при перезагрузке приложения правильно отображается обновленный список, я думаю, что будет необходимо перезагрузить список самостоятельно после его изменения. Для этого вы можете переопределить CWinApp::AddToRecentFileList()
следующее:
void CYourApp::AddToRecentFileList(LPCTSTR lpszPathName)
{
CWinApp::AddToRecentFileList(lpszPathName);
m_pRecentFileList->ReadList();
}
Посмотрите, поможет ли это.
Других решений пока нет …