使用VC中CListCtrl的SortItems对数据排序

首先说明VC中CListCtrl的排序功能非常麻烦,如果有选择的话可以使用第三方的类比如CListCtrlEx等下面来说在VC中标准的CListCtrl是怎么样排序的   
我做这个主要用在一远程文件管理的 文件列表排序中   
1.排序函数的原型   
在CListCtrl中有一个成员函数叫SortItems它接收两个参数一个是用于比如的回调函数另一个是要排序的list指针   
  
2.回调函数的原型   
回调函数是这个样子的   
int CALLBACK ListCompare(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)   
lParam1和lParam2是要比较的两个数据,他是Item值,Item的意思是指list中具体的那一行数据,lParamSort是list的指针,通过lParam1,和lParam2来得到具体的数据   
可以通过以下代码实现   
CString    strItem1 = pListCtrl->GetItemText(lParam1, 2);   
CString    strItem2 = pListCtrl->GetItemText(lParam2, 2);   
在回调函数中相关的问题还有,针对选定的列的处理,正序或者倒序的问题等等   
  
3.排序前的准备   
不要简单的认为直接使用SortItems就可以完成工作了,在开始前一定要对list的各个项做SetItemData设置,因为默认情况下每行数据的ItemData值为0   
,回调函数的两个参数要用ItemData,如果不设置lParam1和lParam2都是0那么就无法完成比较了,完成这个设置可以用下面的函数实现   
  
void CMyList::SetListItemData()   
{   
    int i = m_list.GetItemCount();   
    for (int k=0;k<i;k++)   
    {   
        m_list.SetItemData(k,k);   
    }   
}   
4.对用户选择的具体列进行排序   
比如一行中有 文件名 文件日期 文件大小 当用户点 文件名就用名称排序,实现上可以响应List的LVN_COLUMNCLICK消息   
在消息中这样获取列   
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;   
nSortedCol = pNMListView->iSubItem;   
如何把 这个值传递给 回调函数呢?你应该从CListCtrl中派生出一个子类然后加上一个成员变量来保存这个值,同样道理   
可以加个变量来指定是正向排序还是返向排序   
大概内容要点就是这么多了,网上还有不少文章 但是完整可用的也不多,可以参考vchelp上面<闻怡洋>老师的文章 在ListCtrl中进行排序 
posted on 2010-06-01 13:46  carekee  阅读(5736)  评论(0编辑  收藏  举报