网上看了看 还未实验
对于排序来说首先要确定排序列,然后是按升序或者降序排列,是一列还是多列排序。排序时主要是用到了ClistCtrl中的sortitems()排序函数,这个函数会要求我们自己来提供一个排序函数,以及一个在排序函数中会用到的自定义数据。
BOOL SortItems( PFNLVCOMPARE pfnCompare, DWORD dwData );
(1)排序函数:
pfnCompare 排序函数的定义是:
int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort);
lParam1:
lParam2: 分别是两个比较列的项数据,所以在做排序的时候必须为每列都要先设置项数据,调用setitemdata(),通过项数据我们可以确定每一个项,相当于ID标示的作用。
lParamSort:就是自定义数据。
对于自定义排序函数,返回的值为两(或多列)列比较的大小值。根据每两列比较的返回值进行排序之后会接着调用自定义排序函数,循环的进行排序。
(2)用户数据:
根据要求我们自定义一个结构体,包含我们想要排序的信息
struct P_list{
int count; //排序的列的数目,可以使多列的排序
int isub[]; //排序的列的列号
int flage; //排序的方式,按照升序排列还是降序排列
CLIstctrl* m_iset; //指向列表控件的指针
}
下面是网上看的代码 .
示例代码:
struct MyData...{
CListCtrl *listctrl; //CListCtrl控件指针
int isub; //l列号
int seq; //1为升序,0为降序
};
//次函数为非常重要函数。
int CALLBACK CompareFunc(LPARAM lParam1,LPARAM lParam2,LPARAM lParamSort)
...{
MyData *p=(MyData *)lParamSort;
CListCtrl* list =p->listctrl;
int isub=p->isub;
LVFINDINFO findInfo;
findInfo.flags = LVFI_PARAM;
findInfo.lParam = lParam1;
int iItem1 = list->FindItem(&findInfo, -1);
findInfo.lParam = lParam2;
int iItem2 = list->FindItem(&findInfo, -1); //获取第二项的项数据
CString strItem1 =list->GetItemText(iItem1,isub); //根据项数据,获取项里面子项的lable
CString strItem2 =list->GetItemText(iItem2,isub);
if(p->seq)
return strcmp(strItem2, strItem1);
else
return -strcmp(strItem2, strItem1);
}
本代码来自CSDN博客,转载请标明出处:http://blog.csdn.net/precipitant/archive/2006/09/20/1254878.aspx