我用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比较都没用

解决方案 »

  1.   

    我之前问过很多人,都不告诉我.
    后来搞明白了.
    现在告诉你.
    添加一行的时候,设置关联的一个自定义数据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);
    }