⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 recentfile.cpp

📁 在VC编程环境下
💻 CPP
字号:
/*
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

	文件:RecentFile.cpp	类CRecentFile的执行文件

	版权:Firebird Software Workroom 保留

	声明:本源程序的版权受《中华人民共和国著作权法》以及其
		  它相关法律和条约的保护。任何有机会得到本源程序的
		  个人和机构,未经作者明确授权,不得将本源程序用于
		  任何商业目的(直接的或间接的)。对于非商业目的的使
		  用 (包括复制、传播、编译和修改), 原则上没有特别
		  的限制条款,但请在相关文档中说明其来源,并尊重原
		  作者的署名权。

	编写:秦传安(chings)	2000.5

	联络:Tel:(0792)6323086	E_mail:chings@163.net
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
#include "fclstd.h"
#include "RecentFile.h"

static UINT MruID[] = 
{
	ID_FILE_MRU_FILE1,
	ID_FILE_MRU_FILE2,
	ID_FILE_MRU_FILE3,
	ID_FILE_MRU_FILE4,
	ID_FILE_MRU_FILE5,
	ID_FILE_MRU_FILE6,
	ID_FILE_MRU_FILE7,
	ID_FILE_MRU_FILE8,
	ID_FILE_MRU_FILE9,
	ID_FILE_MRU_FILE10,
	ID_FILE_MRU_FILE11,
	ID_FILE_MRU_FILE12,
	ID_FILE_MRU_FILE13,
	ID_FILE_MRU_FILE14,
	ID_FILE_MRU_FILE15,
	ID_FILE_MRU_FILE16,
};

//######################################################################
CRecentFile::CRecentFile()
{
	for(int i = 0; i<16; i++)
		m_strFileList[i] = NULL;
}

CRecentFile::~CRecentFile()
{
}
//######################################################################
BOOL CRecentFile::Open(CFBApp* pApp,HMENU hMenu,int maxNum,int pos)
{
	if(!pApp || !hMenu)
		return FALSE;

	m_pApp = pApp;

	if(m_nMaxNum > 16)
		m_nMaxNum = 16;

	if(maxNum == 0)
		m_nMaxNum = (int)pApp->RegGetLong("RecentFile","MaxNum",4);
	else
		m_nMaxNum = maxNum;

	if(m_nMaxNum <= 0)
		m_nMaxNum = 4;

	m_hMenu = GetSubMenu(hMenu,pos);
	int i = GetMenuItemCount(m_hMenu);

	for(; i>0; i--)
	{
		if(GetMenuItemID(m_hMenu,i-1) == MruID[0])
			break;
	}
	if(i == 0)
		return FALSE;

	m_nMenuItemPos = i - 1;

	m_nCount = 0;
	char num[4];
	char name[10];

	int j;
	for(i=0; i<m_nMaxNum; i++)
	{
		m_strFileList[i] = new TCHAR[MAX_PATH + _MAX_FNAME];
		memset(m_strFileList[i],0,MAX_PATH + _MAX_FNAME);
		lstrcpy(name,"File");
		itoa(i+1,num,10);
		lstrcat(name,num);
		if(pApp->RegGetString("RecentFile",name,m_strFileList[i],MAX_PATH))
			m_nCount++;

		for(j = 0; j<MAX_PATH; j++)
		{
			if(m_strFileList[i][j] == ';')
			{
				m_strFileList[i][j] = '\0';
				break;
			}
		}
	}
	
	UpdateMenu();

	return TRUE;
}
//######################################################################
void CRecentFile::Add(LPTSTR szFilename,LPTSTR szDispName)
{
	if(szFilename == NULL)return;

	int i;
	for(i=0; i<m_nCount; i++)
	{
		if(lstrcmpi(m_strFileList[i],szFilename) == 0)
			break;
	}

	if((i == m_nCount - 1) && (m_nCount > 0))return;

	LPTSTR tmp;

	if(i<m_nCount)
	{
		tmp = m_strFileList[i];
		for(; i<(m_nCount-1); i++)
			m_strFileList[i] = m_strFileList[i+1];
		m_strFileList[m_nCount -1] = tmp;
	}
	else 
	{
		if(m_nCount < m_nMaxNum)
		{
			i = m_nCount;
			lstrcpy(m_strFileList[m_nCount],szFilename);
			m_nCount++;
			if(m_nCount>m_nMaxNum)
				m_nCount = m_nMaxNum;
		}
		else
		{
			tmp = m_strFileList[0];
			memset(tmp,0,MAX_PATH + _MAX_FNAME);
			for(i = 0; i<(m_nCount - 1); i++)
				m_strFileList[i] = m_strFileList[i+1];
			lstrcpy(tmp,szFilename);
			m_strFileList[m_nCount - 1] = tmp;
			i = m_nCount - 1;
		}

		int n = lstrlen(m_strFileList[i]);
		if(szDispName == NULL)
			m_strFileList[i][n + 1] = '\0';
		else
			lstrcpy(m_strFileList[i] + n + 1,szDispName);
	}

	UpdateMenu();
}
//######################################################################
LPTSTR CRecentFile::GetDisplayName(UINT uCmdID)
{
	LPTSTR name = GetFileName(uCmdID);
	if(name == NULL)
		return NULL;

	int n = lstrlen(name);
	if(name[n + 1] == '\0')
		return GetShortName(name);
	
	return name + n + 1;
}
//######################################################################
LPTSTR CRecentFile::GetShortName(LPTSTR szFullPath)
{
	if(!szFullPath)
		return NULL;

	int i = lstrlen(szFullPath);

	for(; i > 0; i--)
	{
		if(szFullPath[i] == '\\')
			break;
	}

	if(i>0)
		return szFullPath+i+1;
	else
		return szFullPath;
}
//######################################################################
void CRecentFile::UpdateMenu()
{
	if(!m_hMenu)return;

	char text[_MAX_FNAME];
	LPTSTR pDispName = NULL;

	MENUITEMINFO mii;
	memset(&mii,0,sizeof(MENUITEMINFO));
	mii.cbSize = sizeof(MENUITEMINFO);
	mii.fMask = MIIM_DATA|MIIM_TYPE;
	mii.dwTypeData = text;
	mii.cch = _MAX_FNAME;
	GetMenuItemInfo(m_hMenu,m_nMenuItemPos,TRUE,&mii);
	
	DWORD data = mii.dwItemData;
	UINT type = mii.fType;

	for(int i = 0; i < m_nCount; i++)
	{
		if(m_strFileList[i][0] != '\0')
		{
			mii.wID = MruID[i];
			mii.fMask = MIIM_TYPE|MIIM_STATE|MIIM_ID;
			mii.fType = MFT_STRING;
			pDispName = GetDisplayName(mii.wID);
			if(pDispName == NULL)
				continue;
	
			if(GetMenuItemInfo(m_hMenu,mii.wID,FALSE,&mii))
			{
				mii.fState = MFS_ENABLED;
				mii.cch = _MAX_FNAME;
				mii.fType = MFT_STRING;
				lstrcpy(text,pDispName);
				SetMenuItemInfo(m_hMenu,mii.wID,FALSE,&mii);
			}
			else
			{
				mii.fState = MFS_ENABLED;
				mii.cch = _MAX_FNAME;
				lstrcpy(text,pDispName);
				InsertMenuItem(m_hMenu,m_nMenuItemPos,TRUE,&mii);
			}

			mii.fMask = 0;
			mii.fType = 0;
			if(data || type)
			{
				if(data)
				{
					mii.fMask |= MIIM_DATA;
					mii.dwItemData = data;
				}
				if(type)
				{
					mii.fMask |= MIIM_TYPE;
					mii.fType = type;
				}

				SetMenuItemInfo(m_hMenu,mii.wID,FALSE,&mii);
			}
		}
	}
}
//######################################################################
void CRecentFile::Close()
{
	m_pApp->RegSetLong("RecentFile","MaxNum",m_nMaxNum);

	int i,j;
	char num[8];
	char name[16];
	for(i = 0; i<m_nCount; i++)
	{
		lstrcpy(name,"File");
		ltoa(i+1,num,10);
		lstrcat(name,num);
		for(j = 0; j<MAX_PATH; j++)
		{
			if(m_strFileList[i][j] == '\0' && 
				m_strFileList[i][j + 1] != '\0')
			{
				m_strFileList[i][j] = ';';
				break;
			}
		}
		m_pApp->RegSetString("RecentFile",name,m_strFileList[i],MAX_PATH + _MAX_FNAME);
	}

	for(i = 0; i<m_nMaxNum; i++)
		delete [] m_strFileList[i];
}
//######################################################################
LPTSTR CRecentFile::GetFileName(UINT uCmdID)
{
	int i;
	for(i = 0; i<16; i++)
	{
		if(uCmdID == MruID[i])
			break;
	}

	if(i >= m_nCount)
		return NULL;

	return m_strFileList[i];
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -