由于项目需要,在做到一个功能时,需要一个对话框上面的CListCtrl根据用户点击的列表不同,而实现排序功能。查阅了很多资料,总结如下:
1、使用VC++编程,微软在内部对CListCtrl已经有一部分的辅助排序实现代码,自己需要添加简单的函数即可实现。
2、自己需要添加的部分:
(1)响应点集标题栏事件函数,并在这个函数里面添加一些简单的实现代码
void CBudPointMoreDlg::OnLvnColumnclickList1(NMHDR *pNMHDR, LRESULT *pResult) { LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR); // TODO: 在此添加控件通知处理程序代码 ItemData* myData = new ItemData; myData->listctrl = &m_pointsumlist; myData->isub = pNMLV->iSubItem; //为了对不同列的点击在0,1之间,即正序和反序之间进行选择 int sortnum=(int)GetProp(m_pointsumlist.GetSafeHwnd(),"SORT_COLUMN"); int sortasc=(int)GetProp(m_pointsumlist.GetSafeHwnd(),"SORT_DIRECTION"); if(sortnum==pNMLV->iSubItem) { sortasc=(sortasc+1)%2; SetProp(m_pointsumlist.GetSafeHwnd(),"SORT_DIRECTION",(HANDLE)sortasc); } SetProp(m_pointsumlist.GetSafeHwnd(),"SORT_COLUMN",(HANDLE)pNMLV->iSubItem); myData->seq=sortasc; m_pointsumlist.SortItems(CompareFunc,(LPARAM)myData); DeletePointer(myData); *pResult = 0; }
(2)需要添加自己的回调函数,实现对字符串和数字的排序
//排序函数实现 int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) { //通过传递的参数来得到CSortList对象指针,从而得到排序方式 ItemData* pItemMyData=(ItemData*)lParamSort; //通过ItemData来确定数据 CListCtrl* list =pItemMyData->listctrl; int isub=pItemMyData->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); CString strItem2 =list->GetItemText(iItem2,isub); int iCompRes; switch(pItemMyData->isub) { case(0): //以第一列为根据排序 iCompRes=strcmp(strItem1,strItem2); break; case(1): //以第二列为根据排序 if(1/*pInfo1->iAge == pInfo2->iAge*/) { iCompRes = 0; } else { /*iCompRes=(pInfo1->iAge < pInfo2->iAge)?-1:1;*/ } break; default: ASSERT(0); break; } //根据当前的排序方式进行调整 if(pItemMyData->seq) { return iCompRes; } else { return iCompRes*(-1); } }
m_pointsumlist.SetItemData(i,(DWORD)i);