关于CListCtrl的SortItem

happymood 2000-05-18 10:49:00
我用如下方法排CListCtrl的序不得吃,lParam1, lParam2传进函数时都为0, 究竟该怎么做?
static int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort);

ctlList.SortItems(CompareFunc, reinterpret_cast <DWORD> (this));

int CPrgBookListView::CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
CListCtrl* ctlList = reinterpret_cast <CListCtrl*> (lParamSort);

LV_FINDINFO lvi;
memset(&lvi, 0, sizeof(lvi));
lvi.flags = LVFI_PARAM;

lvi.lParam = lParam1;
int nItem1(ctlList->FindItem(&lvi));

lvi.lParam = lParam2;
int nItem2(ctlList->FindItem(&lvi));

CString s1(ctlList->GetItemText(nItem1, 0));

CString s2(ctlList->GetItemText(nItem2, 0));

int nReturn(s1.CompareNoCase(s2));

return nReturn;
}
...全文
357 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
happymood 2000-05-23
  • 打赏
  • 举报
回复
谢谢Asima,可惜这道题我只给了30分。这点分同你的热心不成比例,我只能再说一声谢谢!
Asima 2000-05-23
  • 打赏
  • 举报
回复
我忘了告诉你
缺省情况下调用SortItems(0,0);就是按lpzText排序
Asima 2000-05-22
  • 打赏
  • 举报
回复 1
如果你已经为每一个lvitem设置了lparam 则不用看下边的两句,否则请添上这两句
在CPrgBookListView的某个函数中
CListCtrl * p_List =&GetListCtrl();
for (int i=0;i<p_List->GetItemCount();i++)
p_List->SetItemData(i,i);
在排序之前执行它,也就是说保证排序前每一项的lparam是有效的

另外你的排序函数有问题,lparamSort并不是排序的CListCtrl的指针

int CPrgBookListView::CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
// CListCtrl* ctlList = reinterpret_cast <CListCtrl*> (lParamSort);
//你应该用
CListCtrl * ctlList =&GetListCtrl();//来得到这个指针
//lparamSort是调用SortItems时传递的第二个参数
//通常用它来表示排序是升序还是降序
//比如你可以在函数中令lparamSort为0时返回一个数,为1时返回它的相反数
//这样调用SortItems时第二个参数为1 和0 就是两种相反的排序

LV_FINDINFO lvi;
memset(&lvi, 0, sizeof(lvi));
lvi.flags = LVFI_PARAM;

lvi.lParam = lParam1;
int nItem1(ctlList->FindItem(&lvi));

lvi.lParam = lParam2;
int nItem2(ctlList->FindItem(&lvi));
//如果你的每一项lvitem的lparam没有实际意义
//建议你用我在前边说的方法设置lparam,注意每一项的lparam必须不同
//这样可以直接用nItem1=lparam1;
// nItem2=lparam2;来代替前边几句
//否则就按你原来的方法也可以,此处不必修改
CString s1(ctlList->GetItemText(nItem1, 0));

CString s2(ctlList->GetItemText(nItem2, 0));

int nReturn(s1.CompareNoCase(s2));
//我添加了这一句
if (lparamSort) nReturn= 0-nReturn;
return nReturn;
}
你再试一试
happymood 2000-05-21
  • 打赏
  • 举报
回复
我想根据pszText的值来排序,该怎么做?
Asima 2000-05-19
  • 打赏
  • 举报
回复
lparam1和lparam2是进行比较的两项的lvi的lparam成员
如果你添加每一项时没有为他们设置lparam参数,当然传进取的lparam1和lparam2都是0
建议你在程序中令每一个lv1.lparam=lvi.iItem
注意必须在lvi.mask 中包括 LVIF_PARAM
这样你也不需要用finditem来得到这一项,因为iItem和lparam是一样的值,所以你可以
直接用GetItemText(lparam1)得到s1
直接用GetItemText(lparam2)得到s2
然后进行比较即可
darksky 2000-05-19
  • 打赏
  • 举报
回复
哎!我也有类似的问题!

16,466

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧