2009-12-17 8 views
5

Je souhaite conserver une liste de fichiers récents et simples sur mon application MFC qui montre les 4 derniers noms de fichiers utilisés. J'ai joué avec un exemple du "MFC Answer Book" d'Eugene Kain qui peut ajouter par programmation des chaînes à la liste Recent Files pour une application basée sur l'architecture standard de Document/View: (voir "Gestion de la liste des fichiers récents" (MRU) »):Gestion d'une liste de fichiers récents

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

Mon application est un utilitaire assez léger qui n'utilise l'architecture document/vue de gérer les données, les formats de fichiers et ainsi de suite. Je ne suis pas sûr si les mêmes principes utilisés dans l'exemple ci-dessus seraient applicables ici.

Quelqu'un a-t-il des exemples de la façon dont il est fait pour maintenir une liste de fichiers récents qui est affichée dans le menu Fichier, et peut être stocké dans un fichier/registre quelque part? Plus que tout, c'est mon manque de connaissance et de compréhension qui me retient.

Mise à jour: J'ai récemment trouvé cet article CodeProject être très utile ...

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

Répondre

4

J'ai fait récemment que l'utilisation de MFC, donc, puisque vous semble utiliser MFC et il vous aidera peut-être:

dans:

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

Vous avez seulement besoin que votre application soit dérivée de CWinApp (et j'utilise une classe dérivée de CFrmWnd pour gérer le menu, peut-être que vous faites la même chose?).

Dites-moi si cela fonctionne pour vous. Je ne sais pas si j'ai tout.

+0

J'ai récemment découvert en parallèle une ou deux des choses que vous mentionnez, en particulier LoadStdProfileSettings et AddToRecentFileList qui sont essentielles (+1). – AndyUK

4

Vous pouvez utiliser l'algorithme boost circular buffer pour maintenir la liste alors que le programme est en cours d'exécution, puis enregistrez-le le registre (devrait être trivial) chaque fois qu'il est mis à jour, et le charger quand le programme commence d'abord.

+0

Pourquoi un algoritm de tampon circulaire, un simple vecteur ou un tableau avec 4 places fera l'affaire très bien. Enregistrement dans le registre ou dans un fichier local à des fins de stockage – RvdK

+1

Parce que le buffer circulaire de boost efface automatiquement le premier élément inséré lorsqu'il manque d'espace. Il a été conçu exactement pour des choses comme une liste de fichiers récente. Avec un vecteur à 4 endroits, vous devrez identifier l'élément le plus ancien et le supprimer s'il est plein; avec boost tout est fait automatiquement! –

Questions connexes