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

📄 filelist.cpp

📁 在VC编程环境下
💻 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 + -