2009-12-17 4 views
5

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

Я играл с примером из книги ответов MFC от Eugene Kain, которая может программно добавлять строки в список последних файлов для приложения на основе стандартной архитектуры Document/View: (см. «Управление списком последних файлов» (MRU) "):

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

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

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

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

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

ответ

4

Недавно я сделал это с помощью 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 для обработки меню, возможно, вы делаете то же самое?).

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

+0

Недавно я обнаружил параллельно одну или две вещи, которые вы упомянули, в частности, LoadStdProfileSettings и AddToRecentFileList, которые являются существенными (+1). – AndyUK

4

Вы можете использовать алгоритм boost circular buffer для поддержания списка в то время как программа работает, а затем сохранить его реестр (должен быть тривиальным) каждый раз, когда он обновляется, и загружать его, когда программа запускается впервые.

+0

Почему круговой буферный алгоритм, простой вектор или массив с 4-мя местами будет очень трюк. Сохранение в реестр или локальный файл для целей хранения – RvdK

+1

Поскольку круговой буфер boost автоматически стирает первый элемент, вставленный, когда он заканчивается из пространства. Он был разработан именно для таких вещей, как недавний список файлов. С вектором с 4 местами вам нужно будет идентифицировать самый старый элемент и удалить его, если он будет заполнен; с усилением все это делается автоматически! –

Смежные вопросы