📄 recentfile.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 + -