2009-05-27 18 views
1

Ich möchte, dass der Benutzer die Anzahl der letzten Dateien bearbeiten kann, die im Menü "Datei" meiner MFC-Anwendung angezeigt werden. Ich habe zwei sehr gute Referenzen verwendet:Ändern der Gesamtzahl der zuletzt geöffneten Dateien

Es geht um das Löschen und Neuanlegen der CRecentFileList Objekt gespeichert in CWinApp::m_pRecentFileList. Leider finde ich, dass das Menü nach dem Ersetzen der CRecentFileList nicht richtig aktualisiert wird. Siehe Codeausschnitt unten:

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

Was kann ich tun, um sicherzustellen, dass das, was in das Menü Datei gezogen wird, synchronisiert mit m_pRecentFileList, nachdem ich das Objekt neu erstellen?

+0

Ich bin nicht sicher, ob es hilft, aber ich hatte Probleme mit MFC RecentFileList und Windows 7, wo ich die Funktion SetRegistryKey vor dem Aufruf von LoadStdProfileSettings aufrufen musste (siehe meine Antwort http: // stackoverflow.com/questions/1921231/pflege-a-recent-files-list/1922749 # 1922749). Nicht sicher, ob dies mit Ihrem Problem zusammenhängt. – n1ckp

Antwort

0

Some of Microsoft's documentation schlagen vor, dass Sie CWinApp::LoadStdProfileSettings von innerhalb InitInstance anrufen sollten. Dies deutet darauf hin, dass es etwas ist, das einmal während der Initialisierung statt zur Laufzeit ausgeführt wurde.

Haben Sie versucht, den zweiten der beiden von Ihnen bereitgestellten Links vollständig zu implementieren? Meine Vermutung ist, dass Sie den zweiten Teil anstelle des Anrufs zu CWinApp::LoadStdProfileSettings hinzufügen müssen:

m_pRecentFileList = new CRecentFileList(0, strSection, strEntryFormat, nCount); 
if(m_pRecentFileList) 
{ 
    bReturn = TRUE; 

    // Reload list of MRU files from registry 
    m_pRecentFileList->ReadList(); 
} 

[Bearbeiten] Offenbar m_pRecentFileList verweist auf eine CRecentFileList Class. Haben Sie versucht, CRecentFileList::UpdateMenu anzurufen?

Es gibt another CodeProject example which might help auch.

+0

Sie könnten Recht haben - Ich habe den Code entsprechend geändert, aber das Menü wird immer noch nicht korrekt aktualisiert, nachdem die Anzahl der letzten Dateien programmatisch geändert wurde. Insbesondere reduziert die Reduzierung der Anzahl der zuletzt angezeigten Dateien nicht die Gesamtzahl der zuletzt angezeigten Dateien. – swongu

2

Mein CApp stammt von CWinApp. In initInstance, Sie haben die folgende Zeile:

LoadStdProfileSettings(10); 

Am Ende InitInstance, fügen Sie diesen Code:

m_pmf->m_pRecentFileList = m_pRecentFileList; 

Hier ist m_pmf meine Mainframe-Klasse und ich erstellt ein Mitglied CMainFrame :: m_pRecentFileList vom Typ CRecentFileList Das ist in der MFC-Quelldatei filelist.cpp. m_pRecentFileList auf der rechten Seite ist geschützt und CMainFrame hat keinen Zugriff von außerhalb von InitInstance, aber Sie können hier eine funktionale Kopie erstellen.

  m_pRecentFileList->WriteList(); 
Update

// Force-Registrierung auf Exit:

Am Ende der CMainFrame :: OnClose, ein Registry-Update durch erzwingen. Dies funktioniert nicht ohne Zwang.

Ich muss nicht einmal m_pRecentFileList neu erstellen, der MRU-Mechanismus aktualisiert es korrekt. Beispiel: 5 MRU-Elemente, das erste wird in ein anderes Verzeichnis verschoben und kann nicht mehr gefunden werden. Beim Durchlaufen des Codes im Debugger wird angezeigt, dass der fehlerhafte Eintrag aus der Liste entfernt wurde. Aus irgendeinem Grund wird die aktualisierte Liste nicht korrekt gespeichert, wenn ich sie nicht wie oben beschrieben erzwinge. Ich dachte ursprünglich, dass das Problem etwas mit Privilegien zu tun haben könnte (64-Bit Win7), aber das Ausführen der App als Admin hat nicht geholfen.

Verwandte Themen