上次我也写过一篇博客,能够实现单击列表头排序功能(所有列),不过后来在实际运行中发现原来的那种方法只能识别数字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;
}