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