www.gusucode.com > VC记录最近打开文件源码程序 > VC记录最近打开文件/MruFile.cpp
// MruFile.cpp: implementation of the CMruFile class. // ////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "MruFileTest.h" #include "MruFile.h" #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// CMruFile::CMruFile() { m_IniFileName = _T(""); for( int i=0; i<MAXNUM; i++ ) m_PathName[i] = _T(""); m_CurNum = 0; } CMruFile::~CMruFile() { } //读取ini文件中的最近文件 void CMruFile::ReadMru() { m_CurNum = ::GetPrivateProfileInt("Mru File", "FileNum", 0, m_IniFileName); //读取当前文件数 CString no; for( int i=0; i<m_CurNum; i++) { no.Format( "%d", i+1 ); //求项名 ::GetPrivateProfileString("Mru File", no, "", m_PathName[i].GetBuffer(MAX_PATH), MAX_PATH, m_IniFileName); //读取路径名 m_PathName[i].ReleaseBuffer(); } SetMruMenu(); //修改MRU菜单 } //最近文件写入ini文件 void CMruFile::WriteMru() { CString no; no.Format( "%d", m_CurNum ); ::WritePrivateProfileString( "Mru File", "FileNum", no, m_IniFileName ); //写当前文件数 for( int i=0; i<MAXNUM; i++) { no.Format( "%d", i+1 ); ::WritePrivateProfileString("Mru File", no, m_PathName[i], m_IniFileName); //写路径名 } } //添加最近文件(nPathName-添加的文件路径名) //设计思路:当nPathName在m_PathName[]列表中已存在,须把它提升到表头;若它不存在,则添加到表头,如果表已满,删除表尾的元素。 void CMruFile::AddMru(CString nPathName) { int i; CString str1, str2; if( m_CurNum ) { if( nPathName.CompareNoCase(m_PathName[0])==0 ) //如果nPathName已在表头,结束 return; } str1 = nPathName; i = 0; while( i<m_CurNum && nPathName.CompareNoCase(m_PathName[i])!=0 ) //在表中查找,不相等的元素下移 { str2 = m_PathName[i]; m_PathName[i] = str1; str1 = str2; i++; } if( i<m_CurNum ) m_PathName[i] = str1; //nPathName已存在 else if( m_CurNum<MAXNUM ) { m_PathName[m_CurNum] = str1; //表未满 m_CurNum++; } SetMruMenu(); //修改MRU菜单 WriteMru(); //最近文件写入ini文件 } //清除最近文件 void CMruFile::ClearMru() { m_CurNum = 0; for( int i=0; i<MAXNUM; i++) m_PathName[i].Empty(); SetMruMenu(); //修改MRU菜单 WriteMru(); } //修改最近文件菜单 void CMruFile::SetMruMenu() { CMenu *pMenu = AfxGetMainWnd()->GetMenu(); //主菜单指针 CMenu *pFileMenu = pMenu->GetSubMenu(0); //“文件”菜单指针 CMenu *pMruMenu = pFileMenu->GetSubMenu(5); //“最近文件”菜单指针 pMruMenu->RemoveMenu( ID_MRU1, MF_BYCOMMAND ); //删除各菜单项 pMruMenu->RemoveMenu( ID_MRU2, MF_BYCOMMAND ); pMruMenu->RemoveMenu( ID_MRU3, MF_BYCOMMAND ); pMruMenu->RemoveMenu( ID_MRU4, MF_BYCOMMAND ); if( m_CurNum>0 ) //重新插入各菜单项 pMruMenu->InsertMenu( ID_MRU_CLR, MF_BYCOMMAND, ID_MRU1, m_PathName[0] ); if( m_CurNum>1 ) pMruMenu->InsertMenu( ID_MRU_CLR, MF_BYCOMMAND, ID_MRU2, m_PathName[1] ); if( m_CurNum>2 ) pMruMenu->InsertMenu( ID_MRU_CLR, MF_BYCOMMAND, ID_MRU3, m_PathName[2] ); if( m_CurNum>3 ) pMruMenu->InsertMenu( ID_MRU_CLR, MF_BYCOMMAND, ID_MRU4, m_PathName[3] ); }