专题2:CListCtrl中如何实现排序功能? 1.排序功能的实现需要用到下面这个函数: BOOL SortItems( PFNLVCOMPARE pfnCompare, DWORD dwData ); 其中 第一个参数是回调函数的指针,后面是所要传递的参数 而回调函数一般定义如下: int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort); 其中lParam1是其中list的一项数据,而lparam2是另外一项,第三个参数是刚才传递过来的参数. 2.举例如下: (1)回调函数的编写 注意回调函数必须是全局或者静态的,并且不能调用成员变量,所以要凭借最后一个参数传递某些数据. int CALLBACK CompareFunc(LPARAM lParam1,LPARAM lParam2,LPARAM lParamSort){ //传递list指针 Cmylist *list=(Cmylist*)lParamSort; //获得指定行的索引号 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,list->selectedField); CString strItem2 =list->GetItemText(iItem2,list->selectedField); //判断是升序还是降序 if(!list->shunxu) if(index==1)//判断数据类型是整型还是字符串 return strcmp(strItem2, strItem1); else return atoi(strItem2)-atoi(strItem1); else if(index==1) return -strcmp(strItem2, strItem1); else return atoi(strItem1)-atoi(strItem2);} (2)调用函数的编写 如果是点击列头响应排序功能,那么请响应LVN_COLUMNCLICK: 如果是其他,例如响应菜单项: void Cmylist::OnSheng() { // TODO: Add your command handler code here shunxu=TRUE; SortItems(CompareFunc,(LPARAM)this);} void Cmylist::OnJiang() { // TODO: Add your command handler code here shunxu=FALSE; SortItems(CompareFunc,(LPARAM)this);} 即可完成排序功能!!!

评论