天天看点

CListCtrl::SortItems的用法

 CListCtrl::SortItems的用法:

(一)SortItems使用在哪?

CListCtrl::SortItems的原型是:

BOOL SortItems( PFNLVCOMPARE pfnCompare, DWORD dwData );

其中

1)第一个参数pfnCompare为回调函数,形式为:

int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2,

   LPARAM lParamSort);

lParam1,lParam2是什么?这是SortItems难理解的原因。在(二)中介绍。

lParamSort实际上是列数,等于2)中的dwData。

2)第二个参数dwData为用户自定义值。

dwData实际传入的是列数,等于1)中的lParamSort。

下面是SortItems使用的地方:

CListCtrl::SortItems的用法

// LVN_COLUMNCLICK消息响应函数

CListCtrl::SortItems的用法

void  CUpListCtrl::OnColumnclick(NMHDR *  pNMHDR, LRESULT *  pResult) 

CListCtrl::SortItems的用法
CListCtrl::SortItems的用法

... {

CListCtrl::SortItems的用法

        NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;

CListCtrl::SortItems的用法
CListCtrl::SortItems的用法

        //排序

CListCtrl::SortItems的用法

        //CompareFunc是回调函数

CListCtrl::SortItems的用法

        //pNMListView->iSubItem就是列数

CListCtrl::SortItems的用法

        SortItems( (PFNLVCOMPARE)CompareFunc, pNMListView->iSubItem );

CListCtrl::SortItems的用法
CListCtrl::SortItems的用法

        *pResult = 0;

CListCtrl::SortItems的用法

}

CListCtrl::SortItems的用法

(二)SortItems的的回调函数的中的lParam1,lParam2是什么?

简单的说:是LV_ITEM::lParam。

LV_ITEM是个结构,见msdn。

可见,我们在向CListCtrl插入item时,必须使用

int InsertItem( const LVITEM* pItem );

InsertItem有好几种形式,只有这种形式才能够使用LV_ITEM::lParam。

下面是插入item的代码的一个示例:

CListCtrl::SortItems的用法

    tagInfo  * pFileInfo  =   new  tagInfo; // tagInfo是个结构,存储了你排序的所需要的信息。

CListCtrl::SortItems的用法

    pFileInfo -> strFileName  =  strFileName;

CListCtrl::SortItems的用法

    pFileInfo -> strFileSize  =  FormatFileSize(filefind.GetLength());

CListCtrl::SortItems的用法

    pFileInfo -> strFileType  =  GetTypeName(lpszFileName);

CListCtrl::SortItems的用法

     // pFileInfo->strFilePath = strPath;

CListCtrl::SortItems的用法
CListCtrl::SortItems的用法

     int  nItem  =  GetItemCount();

CListCtrl::SortItems的用法

     int  nIcon  =  GetIconIndex(lpszFileName, filefind.IsDirectory(), FALSE);   

CListCtrl::SortItems的用法
CListCtrl::SortItems的用法

     LV_ITEM lvi;

CListCtrl::SortItems的用法

    lvi.mask  =  LVIF_TEXT | LVIF_PARAM | LVIF_IMAGE;

CListCtrl::SortItems的用法

    lvi.iItem  =  nItem;

CListCtrl::SortItems的用法

    lvi.iSubItem  =   0 ;

CListCtrl::SortItems的用法

    lvi.pszText  =  (LPTSTR)(LPCTSTR)pFileInfo -> strFileName;

CListCtrl::SortItems的用法

    lvi.lParam  =  (LPARAM)pFileInfo;

CListCtrl::SortItems的用法

    lvi.iImage  =  nIcon;

CListCtrl::SortItems的用法
CListCtrl::SortItems的用法

         if ( (nItem  =  InsertItem( & lvi))  !=   - 1  ) // 插入文件名(即第0列),并显示相应图标

CListCtrl::SortItems的用法
CListCtrl::SortItems的用法

     ... {    

CListCtrl::SortItems的用法

        //MessageInt(nItem);

CListCtrl::SortItems的用法

        lvi.mask = LVIF_TEXT;        

CListCtrl::SortItems的用法

        lvi.iItem = nItem;

CListCtrl::SortItems的用法
CListCtrl::SortItems的用法

        //设置第1列(即设置文件大小)        

CListCtrl::SortItems的用法

        lvi.iSubItem = 1;            

CListCtrl::SortItems的用法

        if(!filefind.IsDirectory())//如果不是目录

CListCtrl::SortItems的用法
CListCtrl::SortItems的用法

        ...{    

CListCtrl::SortItems的用法

            lvi.pszText = (LPTSTR)(LPCTSTR)pFileInfo->strFileSize;

CListCtrl::SortItems的用法

            SetItem( &lvi );

CListCtrl::SortItems的用法

        }

CListCtrl::SortItems的用法

        else//如果是目录

CListCtrl::SortItems的用法
CListCtrl::SortItems的用法

        ...{        

CListCtrl::SortItems的用法

            lvi.pszText = (LPTSTR)YCT_UNKNOW_SIZE;

CListCtrl::SortItems的用法

            SetItem( &lvi );

CListCtrl::SortItems的用法

        }                    

CListCtrl::SortItems的用法
CListCtrl::SortItems的用法

        //设置第2列(即设置文件类型)

CListCtrl::SortItems的用法

        lvi.iSubItem = 2;

CListCtrl::SortItems的用法

        lvi.pszText = (LPTSTR)(LPCTSTR)pFileInfo->strFileType;

CListCtrl::SortItems的用法

        SetItem( &lvi );

CListCtrl::SortItems的用法
CListCtrl::SortItems的用法

        //设置第3列(即设置文件所在目录)

CListCtrl::SortItems的用法

        lvi.iSubItem = 3;

CListCtrl::SortItems的用法

        lvi.pszText = (LPTSTR)(LPCTSTR)strPath;

CListCtrl::SortItems的用法

        SetItem( &lvi );

CListCtrl::SortItems的用法
CListCtrl::SortItems的用法

        //更新界面

CListCtrl::SortItems的用法

        //Update( lvi.iItem );

CListCtrl::SortItems的用法

    }

现在lParam指向的是new出来的空间,当然要用delete删除。以下是删除代码:

CListCtrl::SortItems的用法

// LVN_DELETEITEM消息响应函数

CListCtrl::SortItems的用法

// 每删除一个item,系统都要自动调用这个函数的

CListCtrl::SortItems的用法

void  CUpListCtrl::OnDeleteitem(NMHDR *  pNMHDR, LRESULT *  pResult) 

CListCtrl::SortItems的用法
CListCtrl::SortItems的用法

... {

CListCtrl::SortItems的用法

    NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;

CListCtrl::SortItems的用法
CListCtrl::SortItems的用法

    //删除LV_ITEM::lParam所指向的空间

CListCtrl::SortItems的用法

    LV_ITEM lvi;

CListCtrl::SortItems的用法

    lvi.mask = LVIF_PARAM;

CListCtrl::SortItems的用法

    lvi.iItem = pNMListView->iItem;

CListCtrl::SortItems的用法

    lvi.iSubItem = 0;

CListCtrl::SortItems的用法

    if ( GetItem( &lvi ) )

CListCtrl::SortItems的用法
CListCtrl::SortItems的用法

    ...{

CListCtrl::SortItems的用法

        CUpListCtrl::tagInfo* pInfo = (CUpListCtrl::tagInfo*)(lvi.lParam);

CListCtrl::SortItems的用法

        delete pInfo;

CListCtrl::SortItems的用法

    }

CListCtrl::SortItems的用法
CListCtrl::SortItems的用法

    *pResult = 0;

CListCtrl::SortItems的用法

}

(三)编写回调函数

这个就比较简单了,按你的规则排序就可以了。

这里回调函数是个静态成员函数。

CListCtrl::SortItems的用法

// 回调函数

CListCtrl::SortItems的用法

int  CALLBACK CUpListCtrl::CompareFunc(CUpListCtrl::tagInfo *  pInfo1, CUpListCtrl::tagInfo *  pInfo2, LPARAM lCol)

CListCtrl::SortItems的用法
CListCtrl::SortItems的用法

... {

CListCtrl::SortItems的用法

//CListCtrl::SortItems使用的回调函数

CListCtrl::SortItems的用法

//[IN]pInfo1,pInfo2:传入的是LV_ITEM::lParam,在调用InsertItem(const LVITEM* pItem)时指定

CListCtrl::SortItems的用法

//[IN]lCol:指定列数(从零开始),即按哪一列排序

CListCtrl::SortItems的用法
CListCtrl::SortItems的用法
CListCtrl::SortItems的用法

    int nRet = 0;

CListCtrl::SortItems的用法

    ASSERT(lCol>=0 && lCol<NumCol-1);

CListCtrl::SortItems的用法

    ASSERT(pInfo1 != NULL);

CListCtrl::SortItems的用法

    ASSERT(pInfo2 != NULL);

CListCtrl::SortItems的用法

    switch(lCol)

CListCtrl::SortItems的用法
CListCtrl::SortItems的用法

    ...{

CListCtrl::SortItems的用法

    case 0://0列

CListCtrl::SortItems的用法

            //自己按0列规则排序代码

CListCtrl::SortItems的用法

                //想要pInfo1(所代表的item)排在pInfo2(所代表的item)之前,则nRet小于0;反之大于0;顺序不变等于0

CListCtrl::SortItems的用法

        break;

CListCtrl::SortItems的用法

    case 1://1列

CListCtrl::SortItems的用法
CListCtrl::SortItems的用法

        //自己按1列规则排序代码

CListCtrl::SortItems的用法

                //...

CListCtrl::SortItems的用法

        break;

CListCtrl::SortItems的用法

    }

CListCtrl::SortItems的用法
CListCtrl::SortItems的用法

    return nRet;

CListCtrl::SortItems的用法

}