void CMyListCtrl::OnColumnclick(NMHDR* pNMHDR, LRESULT* pResult) 
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
nSortItem = pNMListView->iSubItem;
SortItems(MyCompareProc,(DWORD)this); *pResult = 0;
}int CALLBACK CMyListCtrl::MyCompareProc(LPARAM lParam1,LPARAM lParam2,
  LPARAM lParamSort)
{
CMyListCtrl* pListCtrl = (CMyListCtrl*)lParamSort;
ASSERT( pListCtrl->IsKindOf( RUNTIME_CLASS( CListCtrl ) ) );

CString strItem1 = pListCtrl->GetItemText(lParam1,pListCtrl->nSortItem);
CString strItem2 = pListCtrl->GetItemText(lParam2,pListCtrl->nSortItem); return strcmp(strItem1,strItem2);
}结果后来通过跟踪,发现strItem1和strItem2居然是同一个值,后来进而发现,lParam1和lParam2居然都为0,不知道什么原因

解决方案 »

  1.   

    上面的例子是我照别人的套的,其实我也很不明白,系统是如何知道lParam1和lParam2传递的是行号的
      

  2.   

    系统不知道传递的是行索引,这需要收动设置:SetItemData来设置
      

  3.   

    解释里面有这句话
    The lParam1 and lParam2 parameters specify the item data for the two items being compared. The lParamSort parameter is the same as the dwData value.
    也就是说lParam1和lParam2传递的不是行号,而是你在加入每个新的Item时给它绑定的值
    CListCtrl::SetItemData
    BOOL SetItemData( int nItem, DWORD dwData );
    也就是上面的哪个dwData参数
    如果你在加入新的Item时没有调用SetItemData绑定值,估计哪个值默认会为0
    这也就是你得出来的两个值都为0的原因。
      

  4.   

    可以这样改改试试:
    void CMyListCtrl::OnColumnclick(NMHDR* pNMHDR, LRESULT* pResult) 
    {
    NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
    nSortItem = pNMListView->iSubItem;
    for (int i = 0; i < GetItemCount(); i++)
    {
             SetItemData(i, i);
    }

    SortItems(MyCompareProc,(DWORD)this); *pResult = 0;
    }
    int CALLBACK CMyListCtrl::MyCompareProc(LPARAM lParam1,LPARAM lParam2,
      LPARAM lParamSort)
    {
    CMyListCtrl* pListCtrl = (CMyListCtrl*)lParamSort;
    ASSERT( pListCtrl->IsKindOf( RUNTIME_CLASS( CListCtrl ) ) );

    CString strItem1 = pListCtrl->GetItemText((int)lParam1,
                                pListCtrl->nSortItem);
    CString strItem2 = pListCtrl->GetItemText((int)lParam2,
                                pListCtrl->nSortItem); return strcmp(strItem1,strItem2);
    }