Изменение общего количества последних файлов

Я бы хотел, чтобы пользователь мог редактировать количество последних файлов, отображаемых в меню "Файл" моего приложения MFC. Я использовал две очень хорошие ссылки:

Это включает в себя удаление и воссоздание CRecentFileList объект хранится в CWinApp::m_pRecentFileList, К сожалению, я обнаружил, что меню не обновляется должным образом после замены CRecentFileList, Смотрите фрагмент кода ниже:

void CMyWinApp::SetMRUListSize( int size )
{
   // size guaranteed to be between 1 and 16
   delete m_pRecentFileList ;
   LoadStdProfileSettings( size ) ;
}

Что я могу сделать, чтобы убедиться, что то, что нарисовано в меню Файл, синхронизировано с m_pRecentFileList после того, как я воссоздаю объект?

2 ответа

Мой CApp происходит от CWinApp. В initInstance у вас есть эта строка:

LoadStdProfileSettings(10);

В конце InitInstance добавьте этот код:

m_pmf->m_pRecentFileList = m_pRecentFileList;

Здесь m_pmf - это мой класс MainFrame, и я создал член CMainFrame::m_pRecentFileList типа CRecentFileList, который находится в исходном файле MFC filelist.cpp. Справа m_pRecentFileList защищен, и CMainFrame не имеет доступа к нему извне InitInstance, но вы можете сделать функциональную копию здесь.

В конце CMainFrame::OnClose принудительно обновите реестр:

           m_pRecentFileList->WriteList(); 

// Принудительное обновление реестра при выходе. Это не работает без принуждения.

Мне даже не нужно перестраивать m_pRecentFileList, механизм MRU корректно обновляет его. Пример: 5 элементов MRU, первый перемещен в другой каталог и больше не может быть найден. Выполнение кода в отладчике показывает, что неверная запись удаляется из списка. По какой-то причине обновленный список не сохраняется правильно, если я не заставлю его, как описано выше. Первоначально я думал, что проблема может быть связана с привилегиями (64-битная Win7), но запуск приложения от имени администратора не помог.

Некоторые документы Microsoft предлагают вам позвонить CWinApp::LoadStdProfileSettings изнутри InitInstance, Это говорит мне о том, что это что-то делается один раз во время инициализации, а не во время выполнения.

Вы пытались полностью реализовать вторую из двух предоставленных вами ссылок? Я думаю, вам нужно добавить вторую часть вместо вызова CWinApp::LoadStdProfileSettings:

m_pRecentFileList = new CRecentFileList(0, strSection, strEntryFormat, nCount);
if(m_pRecentFileList)
{
    bReturn = TRUE;

    // Reload list of MRU files from registry
    m_pRecentFileList->ReadList();
}

[Править] Видимо m_pRecentFileList указывает на класс CRecentFileList. Вы пытались вызвать CRecentFileList:: UpdateMenu?

Есть еще один пример CodeProject, который тоже может помочь.

Другие вопросы по тегам