Ведение списка последних файлов - PullRequest
5 голосов
/ 17 декабря 2009

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

Я играл с примером из «Книги ответов MFC» Юджина Кейна, который может программно добавлять строки в список «Недавние файлы» для приложения, основанного на стандартной архитектуре «Просмотр документов»: MRU) "):

http://www.nerdbooks.com/isbn/0201185377

Мое приложение - довольно легкая утилита, которая не использует архитектуру Document / View для управления данными, форматами файлов и так далее. Я не уверен, будут ли здесь применимы те же принципы, что и в приведенном выше примере.

Есть ли у кого-нибудь примеры того, как они ведут список недавних файлов, который отображается в меню «Файл» и может быть сохранен где-нибудь в настройках файла / реестра? Больше всего меня сдерживает недостаток знаний и понимания.

Обновление: я недавно нашел эту статью CodeProject весьма полезной ...

http://www.codeproject.com/KB/dialog/rfldlg.aspx

Ответы [ 2 ]

4 голосов
/ 17 декабря 2009

Я недавно сделал это с помощью MFC, так что, похоже, вы также используете MFC, возможно, это поможет:

в:

BOOL MyApp::InitInstance()
{
    // Call this member function from within the InitInstance member function to 
    // enable and load the list of most recently used (MRU) files and last preview 
    // state.
    SetRegistryKey("MyApp"); //I think this caused problem with Vista and up if it wasn't there
                                 //, not really sure now since I didn't wrote a comment at the time
    LoadStdProfileSettings();
}

// ..

//function called when you save or load a file
void MyApp::addToRecentFileList(boost::filesystem::path const& path)
{
    //use file_string to have your path in windows native format (\ instead of /)
    //or it won't work in the MFC version in vs2010 (error in CRecentFileList::Add at
    //hr = afxGlobalData.ShellCreateItemFromParsingName)
    AddToRecentFileList(path.file_string().c_str());
}

//function called when the user click on a recent file in the menu
boost::filesystem::path MyApp::getRecentFile(int index) const
{
    return std::string((*m_pRecentFileList)[index]);
}

// ...

//handler for the menu
BOOL MyFrame::OnCommand(WPARAM wParam, LPARAM lParam)
{
    BOOL answ = TRUE;

    if(wParam >= ID_FILE_MRU_FILE1 && wParam <= ID_FILE_MRU_FILE16)
    {
        int nIndex = wParam - ID_FILE_MRU_FILE1;

        boost::filesystem::path path = getApp()->getRecentFile(nIndex);
        //do something with the recent file, probably load it

        return answ;
    }
}

Вам нужно только, чтобы ваше приложение было производным от CWinApp (и я использую класс, производный от CFrmWnd для управления меню, может, вы делаете то же самое?).

Скажите, работает ли это для вас. Не уверен, что у меня все есть.

4 голосов
/ 17 декабря 2009

Вы можете использовать алгоритм бустерного циклического буфера для поддержания списка во время работы программы, а затем сохранять его в реестре (должен быть тривиальным) при каждом обновлении и загружать его при запуске программы Первые запуски.

...