首先说明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中进行排序
使用VC中CListCtrl的SortItems对数据排序.txt
最新推荐文章于 2018-07-20 17:50:25 发布