/*加入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;
}

posted on 2008-09-29 18:36  最简单的  阅读(422)  评论(0)    收藏  举报