我扩展了 CMFCListCtrl
类,主要是为了能够轻松按列排序。根据我的经验,只需实现 Sort
和 OnCompareItems
函数即可。
然而,当第二列的类型为string
时,发生了奇怪的排序问题。没有错误提示,但是排序结果不是按字母表顺序排列。
int MyCMFCListCtrl::OnCompareItems(LPARAM lParam1, LPARAM lParam2, int iColumn)
{
if (iColumn == 0)
{
if (lParam1 > lParam2)
return -1;
else if (lParam1 < lParam2)
return 1;
else
return 0;
}
else if (iColumn == 1)
{
CString strCol1, strCol2;
strCol1 = GetItemText(lParam1, iColumn);
strCol2 = GetItemText(lParam2, iColumn);
return strCol1.Compare(strCol2);
}
return 0;
}
void MyCMFCListCtrl::Sort(int iColumn, BOOL bAscending, BOOL bAdd)
{
// Sort available for first and second column
if (iColumn > 1) return;
CMFCListCtrl::Sort(iColumn, bAscending, bAdd);
}
OnCompareItems
中的值对于两个列都是正确的。但最终结果仅对第一个列有效。是否还需要其他函数才能使其正常工作?
strCol1
和strCol2
是否实际包含正确的字符串。在return strCol1.Compare(strCol2);
之前加入TRACE("OnCompareItems: %s %s\n", strCol1, strCol2);
,并检查调试输出。 - JabberwockySetSortColumn
) 函数? - Andrew Truckle