C++ 维护最近的文件列表

C++ 维护最近的文件列表,c++,mfc,recent-file-list,C++,Mfc,Recent File List,我想在我的MFC应用程序上维护一个简单的最近使用的文件列表,其中显示4个最近使用的文件名 我一直在玩Eugene Kain的“MFC答案手册”中的一个示例,该示例可以通过编程将字符串添加到基于标准文档/视图体系结构的应用程序的最近文件列表中:(请参阅“管理最近文件列表(MRU)”): 我的应用程序是一个相当轻量级的实用程序,它不使用文档/视图体系结构来管理数据、文件格式等。我不确定上述示例中使用的相同原则是否适用于此处 有没有人举过一些例子来说明他们如何维护一个最近的文件列表,该列表显示在“文

我想在我的MFC应用程序上维护一个简单的最近使用的文件列表,其中显示4个最近使用的文件名

我一直在玩Eugene Kain的“MFC答案手册”中的一个示例,该示例可以通过编程将字符串添加到基于标准文档/视图体系结构的应用程序的最近文件列表中:(请参阅“管理最近文件列表(MRU)”):

我的应用程序是一个相当轻量级的实用程序,它不使用文档/视图体系结构来管理数据、文件格式等。我不确定上述示例中使用的相同原则是否适用于此处

有没有人举过一些例子来说明他们如何维护一个最近的文件列表,该列表显示在“文件”菜单中,并且可以存储在某个文件/注册表设置中?最重要的是,是我缺乏知识和理解,这让我停滞不前

更新:我最近发现这篇CodeProject文章非常有用


您可以在程序运行时使用该算法维护列表,然后每次更新时将其保存到注册表(应该很简单),并在程序首次启动时加载该列表。

我最近使用MFC实现了这一点,因此,既然您似乎也在使用MFC,那么它可能会有所帮助:

在:

//

//

//菜单的处理程序
BOOL MyFrame::OnCommand(WPARAM WPARAM,LPARAM LPARAM)
{
BOOL answ=真;
if(wParam>=ID\u FILE\u MRU\u FILE1&&wParam getRecentFile(nIndex);
//对最近的文件执行一些操作,可能会加载它
返回answ;
}
}
您只需要您的应用程序是从CWinApp派生的(我使用从CFrmWnd派生的类来处理菜单,也许您也这样做了?)


告诉我这对你是否有效。不确定我是否拥有所有东西。

为什么循环缓冲算法、一个简单的向量或4位数组就可以很好地解决问题。保存到注册表或本地文件以供存储,因为boost的循环缓冲区会在空间不足时自动擦除插入的第一个元素。它是为对于像最近的文件列表这样的东西,这是非常正确的。对于一个有4个位置的向量,你必须识别最旧的元素,如果它已满,就将其删除;对于boost,这一切都是自动完成的!我最近平行发现了你提到的一两件事情,特别是LoadStdProfileSettings和AddToRecentFileList,它们是必不可少的(+1)。
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;
    }
}