2009-12-17 19 views
5

En son kullanılan 4 dosya adını gösteren MFC uygulamasında basit ve güncel bir dosya listesini bulundurmak istiyorum.Son dosya listelerini koruma

Standart Belge/Görünüm mimarisine dayalı bir uygulama için En Son Dosyalar listesine dizeleri programsal olarak ekleyebilen Eugene Kain'in "MFC Yanıt Defteri" örneğinden bir örnekle oynuyordum: (bkz. "Son Dosya Listesini Yönetme" (MRU) "):

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

My uygulama böyle devam verileri, dosya biçimlerini ve yönetmek için Doküman/Görünüm mimarisini kullanmayan oldukça hafif bir yardımcı programdır. Yukarıdaki örnekte kullanılan prensiplerin burada geçerli olup olmayacağından emin değilim.

Dosya menüsünde görüntülenen yeni bir dosya listesini korumakla ilgili herhangi bir örneği var mı ve bir yerde bir dosya/kayıt defteri ayarında saklanabilir mi? Her şeyden çok, beni geri tutan bilgi ve anlayış eksikliğim.

Güncelleme: Geçenlerde bu CodeProject makale oldukça yararlı bulduk ...

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

cevap

4

Geçenlerde yaptığımız siz de MFC kullandığı görünen beri, MFC kullanarak belki yardımcı olacaktır böylece:

yılında:

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

Uygulamanızın sadece CWinApp'dan türetilmiş olması gerekir (ve ben de menüde işlem yapmak için CFrmWnd'den türetilmiş bir sınıf kullanıyorum, belki de aynısını yaparsınız?).

Bunun sizin için uygun olup olmadığını söyleyin. Her şeye sahip olduğumdan emin değilim.

+0

Yakın bir zamanda, bahsettiğiniz şeylerin bir veya ikisini, özellikle de temel olan LoadStdProfileSettings ve AddToRecentFileList'i keşfettim (+1). – AndyUK

4

Program çalışırken listesini tutmak boost circular buffer algoritma kullanılır ve daha sonra kaydedebilirsiniz her güncellendiğinde kayıt defteri (önemsiz olmalıdır) ve program ilk başladığında onu yükleyin.

+0

Dairesel bir tampon algoritması, basit bir vektör veya 4'lü bir dizi, hileyi çok iyi yapar. Depolama amaçları için kayıt defterine veya yerel dosyaya kaydetme – RvdK

+1

Yükseltmenin dairesel tamponu, alan bittiğinde eklenen ilk öğeyi otomatik olarak siler. Son dosya listesi gibi şeyler için tam olarak tasarlanmıştır. 4 yer içeren bir vektör ile en eski öğeyi tanımlamanız ve doluysa onu silmeniz gerekir; takviye ile otomatik olarak tamamlandı! –