上次我也写过一篇博客,能够实现单击列表头排序功能(所有列),不过后来在实际运行中发现原来的那种方法只能识别数字1~9(因为直接用Cstring进行比较).为此我这里再提供一种方法,能够实现较多类型字符的比较,排序
首先,在你的.cpp中定义全局变量
DWORD dwSelColID =0; //选择的列 BOOL bASC = FALSE; //是否升序
在相对应的.h文件中定义联合体
enum { INT_TYPE = 0, STRING_TYPE, DOUBLE_TYPE };
在.cpp中定义回调函数
static int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2,LPARAM lParamSort) { CListCtrl *pListCtrl = (CListCtrl *)lParamSort;//{这里面都是固定语法,适当了解 LVFINDINFO findInfo; findInfo.flags = LVFI_PARAM; findInfo.lParam = lParam1; int iItem1 = pListCtrl->FindItem(&findInfo,-1); findInfo.lParam = lParam2; int iItem2 = pListCtrl->FindItem(&findInfo,-1);//这里面都是固定语法,适当了解} //CString strItem1 = pListCtrl->GetItemText(iItem1, dwSelColID); //需要研究 //CString strItem2 = pListCtrl->GetItemText(iItem2, dwSelColID); //需要研究 //char * str1 =(char * )strItem1.GetBuffer(strItem1.GetLength()); //需要研究 //char * str2 =(char * )strItem2.GetBuffer(strItem1.GetLength()); //需要研究 CString str1,str2; str1=pListCtrl->GetItemText(iItem1,dwSelColID); str2=pListCtrl->GetItemText(iItem2,dwSelColID); HDITEM headerItem; headerItem.mask = HDI_LPARAM; CHeaderCtrl* pHeaderCtrl = pListCtrl->GetHeaderCtrl( ); pHeaderCtrl->GetItem(dwSelColID, &headerItem ); UINT nType = (UINT)(headerItem.lParam); int iCompRes = 0; switch( nType ) { case INT_TYPE: { int i1,i2; i1 = atoi( str1 ); i2 = atoi( str2 ); if( i1 > i2) iCompRes = 1; else if( i1 == i2 ) iCompRes = 0; else iCompRes = -1; } break; case DOUBLE_TYPE: { double i1,i2; i1 = atof( str1 ); i2 = atof( str2 ); if( i1 > i2) iCompRes = 1; else if( i1 == i2 ) iCompRes = 0; else iCompRes = -1; } break; case STRING_TYPE: default: { if( str1 > str2) iCompRes = 1; else if( str1 == str2 ) iCompRes = 0; else iCompRes = -1; } break; } if(bASC) return iCompRes; else return iCompRes*-1; return 0; }
在单击表头响应函数中添加响应操作
void CMy528Update_MfcDlg::OnLvnColumnclickList3(NMHDR *pNMHDR, LRESULT *pResult)//***********************单击表头实现排序 { LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR); if (dwSelColID != pNMLV->iSubItem) { dwSelColID = pNMLV->iSubItem; bASC = bASC; } else bASC = !bASC; int count = m_list3.GetItemCount(); for (int i = 0;i < count;i++) m_list3.SetItemData(i,i); m_list3.SortItems(CompareFunc,(LPARAM)(&m_list3)); *pResult = 0; }