void CTestthreadDlg::OnColumnclickEmailList(NMHDR* pNMHDR, LRESULT* pResult) 
{    NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
    // TODO: Add your control notification handler code here
    if( pNMListView->iSubItem == m_EmailList.m_nSortedCol )
        m_EmailList.m_fAsc = !m_EmailList.m_fAsc;
    else
    {
        m_EmailList.m_fAsc = TRUE;
        m_EmailList.m_nSortedCol = pNMListView->iSubItem;
    }
    int count = m_EmailList.GetItemCount();
    for(int i=0;i<count;i++)    m_EmailList.SetItemData(i,i);
    m_EmailList.SortItems(ListCompare, (DWORD)&m_EmailList);            *pResult = 0;}
int CALLBACK ListCompare(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
    CSortList* pV=(CSortList*)lParamSort;
    //DEMO_DATA* pInfo1 = (DEMO_DATA*)lParam1;
    //DEMO_DATA* pInfo2 = (DEMO_DATA*)lParam2;
    CString szComp1,szComp2;
    int iCompRes;
    switch(pV->m_nSortedCol)
    {
    case(0):
        szComp1=pV->GetItemText(lParam1,0);
        szComp2=pV->GetItemText(lParam2,0);
        iCompRes=szComp1.Compare(szComp2);
        break;
    case(1):
        szComp1=pV->GetItemText(lParam1,1);
        szComp2=pV->GetItemText(lParam2,1);
        iCompRes=szComp1.Compare(szComp2);
        break;
    //case(3):
    default:
        szComp1=pV->GetItemText(lParam1,2);
        szComp2=pV->GetItemText(lParam2,2);
        iCompRes=szComp1.Compare(szComp2);
        break;
        //ASSERT(0);
        //break;
    }
    //根据当前的排序方式进行调整
    if(pV->m_fAsc)
        return iCompRes;
    else
        return iCompRes*-1;
}
折腾了一个晚上,把网上的例子都看过了,终于完成了排序,但是我有些不明白的:lParam1和lParam2是itemdata,但是为什么我只是
for(int i=0;i<count;i++)    m_EmailList.SetItemData(i,i);
这么为它赋值就可以排序呢?原理是什么?还有就是我找不到MSDN关于LISTCTRL排序的文档,我只是找到了SORTITEM()函数里有这么几句:
The comparison function has the following form:int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2, 
   LPARAM lParamSort);The comparison function must return a negative value if the first item should precede the second, a positive value if the first item should follow the second, or zero if the two items are equivalent.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.
等待.........

解决方案 »

  1.   

    LIST控件的每一个item都可以附上一个值,这个值的意义由应用程序自行指定在 LVITEM 结构中的  LPARAM lParam;就是这个值在排序时 LIST 控件把这个值传给应用程序中的比较函数这就是CompareFunc 中LPARAM lParam1, LPARAM lParam2的由来
      

  2.   

    ... 续这种机制很灵活,可以满足各种需求比如楼主的程序里把这个 lParam 指定为每个ITEM 的 index而把 lParamSort 指定为控件类对象的指针这样比较函数得到的信息就是“哪个LIST控件的哪两项”这就可以完成比较从而实现排序
      

  3.   

    ... 续假如 LIST 控件的某个列存放整数值排序是根据数值大小那么在排序前可以把 lParam 指定为这个值而用 lParamSort 表示升序或降序这样也能实现排序