6

MFC アプリケーションで、最近使用した 4 つのファイル名を表示する単純な最近のファイル リストを維持したいと考えています。

Eugene Kain の「The MFC Answer Book」の例を試してみました。この例では、標準のドキュメント/ビュー アーキテクチャに基づいたアプリケーションの最近使用したファイル リストに文字列をプログラムで追加できます (「最近使用したファイル リスト (MRU) の管理」を参照)。 ) :

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

私のアプリケーションは、ドキュメント/ビュー アーキテクチャを使用せずにデータやファイル形式などを管理する、かなり軽量なユーティリティです。上記の例で使用されているのと同じ原則がここで適用できるかどうかはわかりません。

[ファイル] メニューに表示され、どこかのファイル/レジストリ設定に保存できる最近のファイル リストを維持する方法の例はありますか? 何よりも、私の知識と理解の欠如が私の足を引っ張っています。

更新: 最近、この CodeProject の記事が非常に役立つことがわかりました...

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

4

2 に答える 2

5

私は最近MFCを使用してそれを行ったので、MFCも使用しているように見えるので、おそらくそれが役立つでしょう:

の:

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

アプリケーションがCWinAppから派生している必要があるだけです(そして、メニューを処理するためにCFrmWndから派生したクラスを使用します、多分あなたは同じことをしますか?)。

それがあなたのために働くかどうか教えてください。私がすべてを持っているかどうかわからない。

于 2009-12-17T15:59:13.257 に答える