我用vs2010做,用cmfclistctrl派生了一个类,做排序,英文都没问题,但是中文排得乱七八杂,中英文混合也是乱七八糟,而且每次排序的结果都不一样,有时候会好点,有时候很糟糕.虚函数OnCompareItems重写如下:int CMFCListCtrlEx::OnCompareItems(LPARAM lParam1, LPARAM lParam2, int iColumn)
{
// ENSURE(lParam1 != NULL);
// ENSURE(lParam2 != NULL);
if(lParam1==lParam2)return 0;
CString ItemData1 = GetItemText((int)(lParam1 < lParam2 ? lParam1 : lParam2), iColumn);
CString ItemData2 = GetItemText((int)(lParam1 < lParam2 ? lParam2 : lParam1), iColumn);
//return ItemData1.Compare(ItemData2);
return ItemData1.Collate(ItemData2);
}就是用Compare或者Collate比较都没用
{
// ENSURE(lParam1 != NULL);
// ENSURE(lParam2 != NULL);
if(lParam1==lParam2)return 0;
CString ItemData1 = GetItemText((int)(lParam1 < lParam2 ? lParam1 : lParam2), iColumn);
CString ItemData2 = GetItemText((int)(lParam1 < lParam2 ? lParam2 : lParam1), iColumn);
//return ItemData1.Compare(ItemData2);
return ItemData1.Collate(ItemData2);
}就是用Compare或者Collate比较都没用
后来搞明白了.
现在告诉你.
添加一行的时候,设置关联的一个自定义数据L.SetItemData(i,i); // 一般就设置一个唯一的值.不唯一排序可能有点乱,
接着是排序函数:int CMFCListCtrlEx::OnCompareItems(LPARAM lParam1, LPARAM lParam2, int iColumn)
{
// pList 是列表控件指针
CString strItem1,strItem2;
LVFINDINFO lvfi;
lvfi.flags=LVFI_PARAM;
lvfi.lParam=lParam1;
strItem1=pList->GetItemText(pList->FindItem(&lvfi,-1),iColumn);
lvfi.lParam=lParam2;
strItem2=pList->GetItemText(pList->FindItem(&lvfi,-1),iColumn); // 排序 纯粹字符串比较
return _tcsicmp(strItem1, strItem2);
}