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
然后进行比较即可

解决方案 »

  1.   

    我想根据pszText的值来排序,该怎么做?
      

  2.   

    如果你已经为每一个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;
    }
    你再试一试
      

  3.   

    我忘了告诉你
    缺省情况下调用SortItems(0,0);就是按lpzText排序
      

  4.   

    谢谢Asima,可惜这道题我只给了30分。这点分同你的热心不成比例,我只能再说一声谢谢!