swongu
swongu

Reputation: 2299

Changing the Total Number of Recent Files

I'd like the user to be able to edit the number of recent files shown in the File menu of my MFC application. I've used two very good references:

It involves deleting and recreating the CRecentFileList object stored in CWinApp::m_pRecentFileList. Unfortunately, I find that the menu is not updated properly after replacing the CRecentFileList. See code snippet below:

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

What can I do to ensure that what is drawn into the File menu is synchronized with m_pRecentFileList after I recreate the object?

Upvotes: 1

Views: 2810

Answers (2)

Jon Cage
Jon Cage

Reputation: 37516

Some of Microsoft's documentation suggest you should call CWinApp::LoadStdProfileSettings from within InitInstance. This suggests to me that it's something done once during initialisation rather than at run time.

Have you tried fully implementing the second of the two links you provided? My guess is you need to add the second part instead of the call to 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();
}

[Edit] Apparently m_pRecentFileList points to an CRecentFileList Class . Have you tried calling CRecentFileList::UpdateMenu?

There's another CodeProject example which might help too.

Upvotes: 0

Alan Mason
Alan Mason

Reputation: 31

My CApp derives from CWinApp. In initInstance, you have this line:

LoadStdProfileSettings(10);

At the end of InitInstance, add this code:

m_pmf->m_pRecentFileList = m_pRecentFileList;

Here m_pmf is my MainFrame class and I created a member CMainFrame::m_pRecentFileList of type CRecentFileList which is in the MFC source file filelist.cpp. m_pRecentFileList on the right is protected and CMainFrame doesn't have access to it from outside InitInstance, but you can make a functional copy here.

At the end of CMainFrame::OnClose, force a registry update by:

           m_pRecentFileList->WriteList(); 

// Force registry update on exit. This doesn't work without forcing.

I don't even have to rebuild m_pRecentFileList, the MRU mechanism updates it correctly. Example: 5 MRU items, the first is moved to another directory and can no longer be found. Stepping through the code in the debugger shows that the bad entry is removed from the list. For some reason, the updated list isn't saved correctly unless I force it as explained above. I originally thought the problem might have something to do with privileges (64-bit Win7), but running the app as admin didn't help.

Upvotes: 3

Related Questions