📄 filelist.cpp
字号:
/*
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
文件:FileList.cpp
版权:Firebird Software Workroom 保留
声明:任何有机会得到本源程序的人,未经作者明确授权,不得将本源程序
用于任何商业目的。对于非商业目的的使用,亦请在相关文档中说明
其来源。
编写:秦传安 2000.3 - 2000.5
联络:Tel:(0792)6323086 E_mail:chings@163.net
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
#include "fclstd.h"
#include "MainWnd.h"
#include <shellapi.h>
#include "FileList.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CFileListView::CFileListView()
{
}
CFileListView::~CFileListView()
{
}
//////////////////////////////////////////////////////////////////////
BOOL CFileListView::Create(CFBWnd *pParent,UINT uID)
{
UINT style = LVS_SHOWSELALWAYS|LVS_OWNERDRAWFIXED;
return CFBListView::Create(pParent,uID,style);
}
//////////////////////////////////////////////////////////////////////
BOOL CFileListView::OnCreate()
{
SetExStyle(LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT);
LVCOLUMN col;
col.mask = LVCF_FMT | LVCF_TEXT;// | LVCF_WIDTH;
col.fmt = LVCFMT_LEFT;
col.cchTextMax = 8;
col.pszText = "文件名";
InsertColumn(&col,0);
col.fmt = LVCFMT_RIGHT;
col.pszText = "大 小";
InsertColumn(&col,1);
col.fmt = LVCFMT_LEFT;
col.pszText = "文件类型";
InsertColumn(&col,2);
col.pszText = "修改日期";
InsertColumn(&col,3);
SHFILEINFO ssfi;
HIMAGELIST hSystemSmallImageList,him;
hSystemSmallImageList = (HIMAGELIST)SHGetFileInfo("C:\\", 0, &ssfi,
sizeof(SHFILEINFO), SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
him = ImageList_Duplicate(hSystemSmallImageList);
ImageList_SetBkColor(him,CLR_NONE);
SetImageList(him);
ImageList_SetBkColor(him,CLR_NONE);
return TRUE;
}
////////////////////////////////////////////////////////////////////////////////////////
LRESULT CFileListView::WindowProc(UINT msg,WPARAM wParam,LPARAM lParam)
{
if(msg == WM_SIZE)
{
SIZE sz;
sz.cx = LOWORD(lParam);
sz.cy = HIWORD(lParam);
OnSize(sz);
return 0;
}
return CFBListView::WindowProc(msg,wParam,lParam);
}
////////////////////////////////////////////////////////////////////////////////////////
void CFileListView::Add(LPWIN32_FIND_DATA pwfd,LPTSTR szFullPath)
{
if(!pwfd)return;
if(pwfd->cFileName[0] == '.')
return;
char szFileLen[32];
char szTime[16];
char tmp[16];
int n;
SYSTEMTIME time;
SHFILEINFO sfi;
LVITEM lvi;
LPFILE_INFO pfi = new FILE_INFO;
memset(pfi,1,sizeof(FILE_INFO));
memcpy(&pfi->FileData,pwfd,sizeof(WIN32_FIND_DATA));
if(szFullPath)
{
n = lstrlen(szFullPath);
memcpy(pfi->strFullPath,szFullPath,n+1);
if(pfi->strFullPath[n-1] != '\\')
{
pfi->strFullPath[n] = '\\';
pfi->strFullPath[n + 1] = '\0';
}
}
lstrcat(pfi->strFullPath,pwfd->cFileName);
ltoa(pwfd->nFileSizeLow,szFileLen,10);
FileTimeToSystemTime(&pwfd->ftLastWriteTime,&time);
GetDateFormat(LOCALE_SYSTEM_DEFAULT,
LOCALE_NOUSEROVERRIDE | DATE_USE_ALT_CALENDAR,
&time,
NULL,
szTime,
64);
GetTimeFormat(LOCALE_SYSTEM_DEFAULT,
LOCALE_NOUSEROVERRIDE|TIME_NOSECONDS,
&time,
NULL,
tmp,
32);
lstrcat(szTime," ");
lstrcat(szTime,tmp);
SHGetFileInfo(pfi->strFullPath, 0, &sfi,sizeof(SHFILEINFO),
SHGFI_SYSICONINDEX | SHGFI_SMALLICON |
SHGFI_ATTRIBUTES | SHGFI_TYPENAME);
pfi->dwAttrib = sfi.dwAttributes;
lstrcpy(pfi->strTypeName,sfi.szTypeName);
lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM;
lvi.iItem = GetItemCount();
lvi.iSubItem = 0;
lvi.iImage = sfi.iIcon;
lvi.pszText = pwfd->cFileName;
lvi.cchTextMax = MAX_PATH;
lvi.lParam = (LPARAM)pfi;
InsertItem(&lvi);
lvi.mask = LVIF_TEXT;
if(pfi->dwAttrib & SFGAO_FOLDER)
szFileLen[0] = '\0';
else
lstrcat(szFileLen," 字节");
lvi.pszText = szFileLen;
lvi.cchTextMax = 32;
lvi.iSubItem = 1;
SetItem(&lvi);
lvi.pszText = sfi.szTypeName;
lvi.cchTextMax = 80;
lvi.iSubItem = 2;
SetItem(&lvi);
lvi.mask = LVIF_TEXT;
lvi.pszText = szTime;
lvi.cchTextMax = 16;
lvi.iSubItem = 3;
SetItem(&lvi);
}
////////////////////////////////////////////////////////////////////////////////////////
void CFileListView::Remove(int index)
{
if(index<0 || index>=GetItemCount())
return;
LVITEM lvi;
lvi.mask = LVIF_PARAM;
lvi.iItem = index;
GetItem(&lvi);
LPFILE_INFO pfi = (LPFILE_INFO)lvi.lParam;
delete pfi;
DeleteItem(index);
}
////////////////////////////////////////////////////////////////////////////////////////
void CFileListView::RemoveAll()
{
int n = GetItemCount();
if(n == 0)
return;
LVITEM lvi;
lvi.mask = LVIF_PARAM;
for(int i=0;i<n;i++)
{
lvi.iItem = i;
GetItem(&lvi);
LPFILE_INFO pfi = (LPFILE_INFO)lvi.lParam;
delete pfi;
}
DeleteAllItem();
}
////////////////////////////////////////////////////////////////////////////////////////
void CFileListView::FillFileList(LPCTSTR szPath)
{
char strFindFile[MAX_PATH];
char strFileDir[MAX_PATH];
lstrcpy(strFileDir,szPath);
int len = lstrlen(strFileDir);
if(strFileDir[len-1] != '\\')
lstrcat(strFileDir,"\\");
RemoveAll();
lstrcpy(strFindFile,strFileDir);
lstrcat(strFindFile,"*.*");
FindFiles(strFindFile);
Sort(SortProc,0);
}
//////////////////////////////////////////////////////////////////////
BOOL CFileListView::FindFiles(LPTSTR szFile)
{
int i = 0;
WIN32_FIND_DATA wfd;
memset(&wfd,0,sizeof(WIN32_FIND_DATA));
wfd.dwFileAttributes = FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_DIRECTORY;
HANDLE hFind = FindFirstFile(szFile,&wfd);
if(hFind == INVALID_HANDLE_VALUE)
return FALSE;
int n = lstrlen(szFile);
for(i=n-1;i>0;i--)
{
if(szFile[i] == '\\')
{
szFile[i+1] = '\0';
break;
}
}
do
{
Add(&wfd,szFile);
}while(FindNextFile(hFind,&wfd));
FindClose(hFind);
return TRUE;
}
//////////////////////////////////////////////////////////////////////
void CFileListView::OnSize(SIZE &sz)
{
SetColumnWidth(0,140);
SetColumnWidth(1,100);
SetColumnWidth(2,120);
SetColumnWidth(3,sz.cx - 360);
}
//////////////////////////////////////////////////////////////////////
//排序的回调函数
int CALLBACK CFileListView::SortProc(LPARAM lParam1,LPARAM lParam2,LPARAM lSortParam)
{
LPFILE_INFO pfi1 = (LPFILE_INFO)lParam1;
LPFILE_INFO pfi2 = (LPFILE_INFO)lParam2;
if((pfi1->dwAttrib & SFGAO_FOLDER) && !(pfi2->dwAttrib & SFGAO_FOLDER))
return -1;
if((pfi2->dwAttrib & SFGAO_FOLDER) && !(pfi1->dwAttrib & SFGAO_FOLDER))
return 1;
int nRet;
switch(lSortParam)
{
case 1://按文件大小排序
nRet = pfi1->FileData.nFileSizeLow - pfi2->FileData.nFileSizeLow;
break;
case 2://按类型名排序
nRet = lstrcmpi(pfi1->strTypeName,pfi2->strTypeName);
break;
case 3://按修改日期排序
nRet = CompareFileTime(&pfi1->FileData.ftLastWriteTime, &pfi2->FileData.ftLastWriteTime);
break;
default://缺省:按文件名排序
nRet = lstrcmpi(pfi1->FileData.cFileName,pfi2->FileData.cFileName);
break;
}
return nRet;
}
////////////////////////////////////////////////////////////////////////////////////////
void CFileListView::OnNotify(LPNMHDR pNMHDR,LRESULT &lResult)
{
if(pNMHDR->code == LVN_COLUMNCLICK)
{
if(GetItemCount() <= 1)return;
NM_LISTVIEW *pnmlv = (NM_LISTVIEW*)pNMHDR;
Sort(SortProc,pnmlv->iSubItem);
}
else
CFBListView::OnNotify(pNMHDR,lResult);
}
////////////////////////////////////////////////////////////////////////////////////////
void CFileListView::ReCalcLayout(LPRECT prc)
{
SetWindowPos(m_hWnd,NULL,prc->left,prc->top,
prc->right - prc->left,prc->bottom - prc->top,
SWP_NOZORDER|SWP_NOACTIVATE|SWP_NOCOPYBITS);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -