2009-12-17 8 views
5

Me gustaría mantener una lista simple de archivos recientes en mi aplicación MFC que muestra los 4 nombres de archivo usados ​​más recientemente.Mantenimiento de una lista de archivos recientes

He estado jugando con un ejemplo de "The MFC Answer Book" de Eugene Kain que puede agregar secuencias programáticamente a la lista de Archivos recientes para una aplicación basada en la arquitectura estándar Document/View: (ver "Administrar la lista de archivos recientes" (MRU) "):

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

Mi aplicación es una utilidad bastante ligero que no utiliza la arquitectura Documento/vista para gestionar los datos, formatos de archivo y así sucesivamente. No estoy seguro si los mismos principios utilizados en el ejemplo anterior serían aplicables aquí.

¿Alguien tiene algún ejemplo de cómo mantener una lista de archivos recientes que se muestra en el menú Archivo y se puede almacenar en un archivo/configuración de registro en algún lugar? Más que nada, es mi falta de conocimiento y comprensión lo que me está frenando.

Actualización: He encontrado recientemente este artículo CodeProject a ser bastante útil ...

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

Respuesta

4

Hace poco hizo que el uso de MFC, por lo que ya parece estar usando MFC, así que tal vez ayudará a:

en:

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; 
    } 
} 

Solo necesita que su aplicación se derive de CWinApp (y yo use una clase derivada de CFrmWnd para manejar el menú, ¿tal vez usted haga lo mismo?).

Dime si eso funciona para ti. No estoy seguro si tengo todo.

+0

Recientemente descubrí en paralelo una o dos de las cosas que menciona, particularmente LoadStdProfileSettings y AddToRecentFileList, que son esenciales (+1). – AndyUK

4

Usted puede utilizar el algoritmo boost circular buffer para mantener la lista, mientras que el programa se está ejecutando, y luego guardarlo en el registro (debe ser trivial) cada vez que se actualiza, y lo carga cuando el programa se inicia por primera vez.

+0

¿Por qué un algoritmo de búfer circular, un vector simple o una matriz con 4 lugares hará bien el truco. Guardar en el registro o archivo local con fines de almacenamiento – RvdK

+1

Porque el búfer circular de boost borra automáticamente el primer elemento insertado cuando se queda sin espacio. Fue diseñado exactamente para cosas como una lista de archivos recientes. Con un vector con 4 lugares, deberá identificar el elemento más antiguo y eliminarlo si está lleno; con impulso todo se hace automáticamente! –

Cuestiones relacionadas