2009-05-27 4 views
1

J'aimerais que l'utilisateur puisse modifier le nombre de fichiers récents affichés dans le menu Fichier de mon application MFC. Je l'ai utilisé deux très bonnes références:Modification du nombre total de fichiers récents

Il implique et recréant l'suppression objet CRecentFileList stocké dans CWinApp::m_pRecentFileList. Malheureusement, je trouve que le menu n'est pas mis à jour correctement après avoir remplacé le CRecentFileList. Voir l'extrait de code ci-dessous:

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

Que puis-je faire pour vous assurer que ce qui est aspiré dans le menu Fichier est synchronisé avec m_pRecentFileList après que je recréez l'objet?

+0

Je ne suis pas sûr si cela aidera, mais j'ai eu des problèmes avec MFC RecentFileList et Windows 7 où j'ai dû appeler la fonction SetRegistryKey avant l'appel à LoadStdProfileSettings (voir ma réponse http: // stackoverflow.com/questions/1921231/maintenance-a-recent-files-list/1922749 # 1922749). Je ne sais pas si c'est lié à votre problème. – n1ckp

Répondre

0

Some of Microsoft's documentation vous suggérons d'appeler CWinApp::LoadStdProfileSettings depuis InitInstance. Cela me suggère que c'est quelque chose qui a été fait une fois lors de l'initialisation plutôt qu'à l'exécution.

Avez-vous essayé de mettre entièrement en œuvre la deuxième des deux liaisons que vous avez fournies? Je suppose que vous devez ajouter la deuxième partie au lieu de l'appel à 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(); 
} 

[Modifier] Apparemment m_pRecentFileList des points à un CRecentFileList Class. Avez-vous essayé d'appeler CRecentFileList::UpdateMenu? Il y a aussi another CodeProject example which might help.

+0

Vous avez peut-être raison - j'ai modifié le code en conséquence, mais le menu n'est toujours pas mis à jour correctement après avoir modifié par programme le nombre de fichiers récents. Plus précisément, la réduction du nombre de fichiers récents affichés ne réduit pas le nombre total de fichiers récents affichés. – swongu

2

Mon CApp dérive de CWinApp. En initInstance, vous avez cette ligne:

LoadStdProfileSettings(10); 

A la fin de InitInstance, ajoutez ce code:

m_pmf->m_pRecentFileList = m_pRecentFileList; 

Ici m_pmf est ma classe mainframe et j'ai créé un membre CMainFrame :: m_pRecentFileList de type CRecentFileList qui se trouve dans le fichier source MFC filelist.cpp. m_pRecentFileList à droite est protégé et CMainFrame n'y a pas accès depuis l'extérieur d'InitInstance, mais vous pouvez en faire une copie fonctionnelle ici.

A la fin de CMainFrame :: OnClose, la force une mise à jour du Registre par:

  m_pRecentFileList->WriteList(); 

// mise à jour du registre de travail sur la sortie. Cela ne fonctionne pas sans forcer.

Je n'ai même pas besoin de reconstruire m_pRecentFileList, le mécanisme MRU le met à jour correctement. Exemple: 5 articles MRU, le premier est déplacé vers un autre répertoire et ne peut plus être trouvé. L'exécution du code dans le débogueur indique que l'entrée incorrecte est supprimée de la liste. Pour une raison quelconque, la liste mise à jour n'est pas enregistrée correctement sauf si je la force comme expliqué ci-dessus. J'ai d'abord pensé que le problème pouvait avoir quelque chose à voir avec les privilèges (Win7 64 bits), mais l'exécution de l'application en tant qu'administrateur n'a pas aidé.

Questions connexes