/*加入LIST控件,并给其添加控制变量m_list*/
/*此在头文件中定义*/
public:
/*此结构体用来传递排序时回调函数需要的参数*/
typedef struct _Item
{
CListCtrl *mlist;
int Isub;
}Item;
private:
/*此为搜索指针*/
WIN32_FIND_DATA *pAlbumData;
/*此用来记录搜索结果,文件个数*/
int nTotalFileCount;
//初始化ListCtrl
void InitListCtrl();
void GetAllFileInfo(LPCWSTR lpFileName);
void InitFileData();
/*此为搜索路径和条件*/
#define FILEPATHNAME _T("Storage Card\\*.wav")
/**************************************************
此用于List控件的刷新
***************************************************/
void CRecordingDlg::InitFileData()
{
nTotalFileCount = 0;
GetAllFileInfo(FILEPATHNAME);
pAlbumData -= nTotalFileCount; //将指针指向开头
}
/*
函数功能:获得目标路径条件下的文件总数
入口参数:lpFileName:用户自定义的搜索路径和条件
出口参数:无
返回值:无
*/
void CRecordingDlg::GetAllFileInfo(LPCWSTR lpFileName)
{
//
pAlbumData = new WIN32_FIND_DATA[MAXFILECOUNT];
HANDLE hSearch;
bool bFinished = false;
//开始按搜索条件搜索
hSearch = FindFirstFile(lpFileName,pAlbumData);
if(hSearch == INVALID_HANDLE_VALUE)
{
return;
}
nTotalFileCount++;
while((!bFinished) && (nTotalFileCount < MAXFILECOUNT))
{
pAlbumData++;
if(!FindNextFile(hSearch,pAlbumData))
{
bFinished=true;
}
else
{
if((pAlbumData->nFileSizeLow == 0) && (pAlbumData->nFileSizeHigh == 0))
{
pAlbumData--;
nTotalFileCount--;
}
nTotalFileCount++;
}
}
if(!FindClose(hSearch))
{
AfxMessageBox(_T("关闭查找句柄失败"));
}
}
/*初始list中的各项值*/
void CRecordingDlg::InitListCtrl()
{
CRect rect;
TCHAR buf[15];
int iItem,iSubItem,iActualItem;
LVITEM lvitem;
//删除"名称""大小""创建时间"这三项
m_List.DeleteColumn(0);
m_List.DeleteColumn(0);
m_List.DeleteColumn(0);
m_List.DeleteAllItems(); //删除所有的行
m_List.GetClientRect(&rect);
//定义控件的第0行、即标题
m_List.InsertColumn(0,_T("名称"),LVCFMT_LEFT,rect.Width()*0.6);
m_List.InsertColumn(1,_T("大小"),LVCFMT_LEFT,rect.Width()*0.2);
m_List.InsertColumn(2,_T("创建时间"),LVCFMT_LEFT,rect.Width()*0.2);
//载入控件中将要显示的内容
for(iItem = 0; iItem < nTotalFileCount; iItem++)
{
for(iSubItem = 0; iSubItem < 3; iSubItem++)
{
if(iSubItem == 0)
{
lvitem.iImage = 0;
}
lvitem.mask = LVIF_TEXT|(iSubItem == 0 ? LVIF_IMAGE : 0);
lvitem.iItem = ((iSubItem == 0) ? iItem : iActualItem);
lvitem.iSubItem = iSubItem;
if(iSubItem == 0)
{
lvitem.pszText = (pAlbumData + iItem)->cFileName;
}
else if(iSubItem==1)
{
wsprintf(buf,L"%d",(((pAlbumData+iItem)->nFileSizeHigh<<32)
+(pAlbumData+iItem)->nFileSizeLow)/1024);
wcscat(buf,L"KB");
lvitem.pszText=buf;
}
else if(iSubItem==2)
{
SYSTEMTIME systime;
GetSystemTime(&systime);
FileTimeToSystemTime(&((pAlbumData+iItem)->ftLastWriteTime),&systime);
wsprintf(buf,_T("%d-%02d-%02d"),systime.wYear,systime.wMonth,systime.wDay);
lvitem.pszText=buf;
}
if(iSubItem==0)
{
iActualItem=m_List.InsertItem(&lvitem);
}
else
{
m_List.SetItem(&lvitem);
}
}
}
delete []pAlbumData;
}
/************************************************
此用来给list排序
************************************************/
Item mItem;
static int nSortOrder = 1; // 排序的方式,1升序,-1降序。
double StrToFloat(CString str)
{
char *buf;
USES_CONVERSION;
buf=T2A(str);
return atof(buf);
}
/*回调函数*/
int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
/* 得到排序方式*/
Item* pV=(Item*)lParamSort;
/* 得到两个列的排序信息*/
CString sz1 = pV->mlist->GetItemText(lParam1,pV->Isub);
CString sz2 = pV->mlist->GetItemText(lParam2,pV->Isub);
if(mItem.Isub == 1)
{
TCHAR tch1[32],tch2[32];
wcscpy(tch1,sz1.GetBuffer(sz1.GetLength() - 1));
wcscpy(tch2,sz2.GetBuffer(sz2.GetLength() - 1));
sz1 = tch1;
sz2 = tch2;
float i1,i2;
i1 = StrToFloat(sz1);
i2 = StrToFloat(sz2);
int n;
if(i1 > i2)
{
n = 1;
}
else if(i1 < i2)
{
n = -1;
}
else
{
n = 0;
}
if(nSortOrder == 1)
{
return n;
}
else
{
return -n;
}
}
else
{
if(nSortOrder == 1)
{
return sz1.Compare(sz2);
}
else
{
return -sz1.Compare(sz2);
}
}
}
/*点击list表头事件,用来排序排序*/
void CRecordingDlg::OnColumnclickList(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
/* 保存当前的排序列,-1表示未排序*/
static int ncurSortCol = -1;
/* 若当前排序列与点击列相同,则更改增、减序的排序方式
若点击列与当前排序列不同的列,则改变排序序,并将排序方式改为增序*/
if (ncurSortCol == pNMListView->iSubItem)
{
if (nSortOrder == 1)
{
nSortOrder = -1;
}
else
{
nSortOrder = 1;
}
}
else
{
ncurSortCol = pNMListView->iSubItem;
nSortOrder = 1;
}
mItem.mlist = &m_List;
mItem.Isub = pNMListView->iSubItem;
for(int i=0;i < m_List.GetItemCount();i++)
{
m_List.SetItemData(i,i);
}
/* 开始排序*/
m_List.SortItems(CompareFunc,(LPARAM)&mItem);
*pResult = 0;
}