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
然后进行比较即可
如果你添加每一项时没有为他们设置lparam参数,当然传进取的lparam1和lparam2都是0
建议你在程序中令每一个lv1.lparam=lvi.iItem
注意必须在lvi.mask 中包括 LVIF_PARAM
这样你也不需要用finditem来得到这一项,因为iItem和lparam是一样的值,所以你可以
直接用GetItemText(lparam1)得到s1
直接用GetItemText(lparam2)得到s2
然后进行比较即可
在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;
}
你再试一试
缺省情况下调用SortItems(0,0);就是按lpzText排序