排序CMFCListCtrl时出现奇怪行为
Strange behaviour while sorting CMFCListCtrl
本文关键字:CMFCListCtrl 排序 更新时间:2023-10-16
我扩展了CMFCListCtrl
类,主要是为了能够轻松地按列排序。根据我的经验,实现Sort
和OnCompareItems
功能就足够了。
发生的情况是,排序对第一列(类型为integer
(很好,但对第二列(类型是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
中得到的值对这两列都可以。但最终结果只对第一个有效。是否有其他必要的功能使其发挥作用?
CMFCListCtrl::Sort
将调用CListCtrl::SortItems
。SortItems
将向回调函数传递LPARAM
项数据。该CCD_ 11是可以用CCD_ 12设置的值。
这意味着OnCompareItems
中的lParam1
和lParam2
仅参考LPARAM
数据。
在这种情况下,GetItemText(lParam1, iColumn)
是未定义的行为,因为lParam1
不引用行号。
另请参阅LVM_SORTITEMS
和LVM_SORTITEMSEX
的文档
您可以覆盖
Sort
并调用SortItemsEx
。这样,lParam1
和lParam2
将引用行号,而GetItemText(lParam1, iColumn)
将是一个有效的调用,如下所示。注意,(iColumn == 0)
条件仅在先前调用SetItemData
的情况下使用。
int MyCMFCListCtrl::OnCompareItems(LPARAM lParam1, LPARAM lParam2, int iColumn)
{
if(iColumn == 0)//assuming SetItemData was called earlier
return lParam1 - lParam2;
CString strCol1 = GetItemText(lParam1, iColumn);
CString strCol2 = GetItemText(lParam2, iColumn);
return strCol1.Compare(strCol2);
}
void MyCMFCListCtrl::Sort(int iColumn, BOOL bAscending, BOOL bAdd)
{
if(iColumn == 0)//assuming SetItemData was called earlier
{
//call SortItem and get LPARAM data in call back function
CMFCListCtrl::Sort(iColumn, bAscending, bAdd);
return;
}
//call SortItemEx instead, get row numbers in callback function
CWaitCursor wait;
GetHeaderCtrl().SetSortColumn(iColumn, bAscending, bAdd);
m_iSortedColumn = iColumn;
m_bAscending = bAscending;
SortItemsEx(CompareProc, (LPARAM)this);
}
相关文章:
- 二叉排序树无法编译
- 仅使用绝对值对数组进行排序,并在C++中显示实际值
- C++选择排序算法中的逻辑错误
- 使用C++程序合并排序没有得到正确的输出
- 计算排序向量的向量中唯一值的计数
- 排序算法c++
- 使用2个键的cpp-stl::优先级队列排序不正确
- 将结构向量排序为子组
- 在c++中尝试对对象数组进行排序时,出现std:bad_alloc错误
- 如何对点云数据进行排序
- 对字符串进行排序时,在c++中处理sort()
- 是否有类似std::lower_bound的函数,而不需要排序/分区输入
- 下面是排序算法O(n)吗
- std::sort()函数无法对向量的一部分进行排序
- shell排序中的交换和比较
- clang格式:禁用排序包含
- 显示错误输出的简单数组排序程序
- 排序CMFCListCtrl时出现奇怪行为
- 对CMFCLISTCTRL排序时奇怪的(?)行为
- 更改 CMFCListCtrl 的默认排序箭头