再談CListCtrl的 各列 排序

爲了搞清楚 CListCtrl 的 SetItemData 中 Data 指的是 什麼。寫了如下函數

int CALLBACK CompareName(LPARAM lParam1, LPARAM lParam2, LPARAM subItem)
{
    CListCtrl3Dlg  *pDlg=(CListCtrl3Dlg *)AfxGetMainWnd();
    CListCtrl* pListCtrl = (CListCtrl*) &pDlg->m_ListSrc;
    if(pListCtrl->GetStyle() & LVS_SORTASCENDING)
        return (pListCtrl->GetItemText(lParam1, subItem).Compare(
                pListCtrl->GetItemText(lParam2, subItem)));
    else
        return (pListCtrl->GetItemText(lParam2, subItem).Compare(
                pListCtrl->GetItemText(lParam1, subItem)));
}

void CListCtrl3Dlg::OnColumnclickSrc(NMHDR* pNMHDR, LRESULT* pResult) 
{
    // TODO: Add your control notification handler code here
    NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
    const int nCol = pNMListView->iSubItem;
// change column 
    LV_COLUMN lvcolumn;
    memset(&lvcolumn, 0, sizeof(lvcolumn));
    lvcolumn.mask = LVCF_IMAGE | LVCF_FMT;
    lvcolumn.fmt  = LVCFMT_COL_HAS_IMAGES;
    m_ListSrc.GetColumn(nCol, &lvcolumn);
    static int ColSorts[2]={LVS_SORTASCENDING,LVS_SORTASCENDING};
// save old sort
    if(lvcolumn.iImage == IMG_DESCENDING)// show next sorting way, not current result
    {
        lvcolumn.iImage=IMG_ASCENDING;
        ColSorts[nCol]=LVS_SORTASCENDING;
    }
    else
    {
        lvcolumn.iImage=IMG_DESCENDING;
        ColSorts[nCol]=LVS_SORTDESCENDING;
    }
    m_ListSrc.SetColumn(nCol,&lvcolumn);
// transfer to style
    if(ColSorts[nCol]==LVS_SORTDESCENDING)
        m_ListSrc.ModifyStyle(LVS_SORTDESCENDING,LVS_SORTASCENDING);
    else
        m_ListSrc.ModifyStyle(LVS_SORTASCENDING,LVS_SORTDESCENDING);
// have to SetItemData(int nItem, DWORD dwData) or SetItem(i,0,LVIF_PARAM,NULL,0,0,0,(LPARAM)i); 
#ifdef CHECK_LPARAM // that's ItemData
    LVITEM lvi; 
    lvi.mask =  LVIF_PARAM;
    lvi.iSubItem = 0;
    lvi.pszText = 0;
    lvi.iImage = 0;    
    for(int i=0;i<m_ListSrc.GetItemCount();i++)
    {
        lvi.iItem = i;
        m_ListSrc.GetItem(&lvi);
        afxDump << lvi.lParam << " ";// 9 8 7 6 5 4 3 2 1 0
        lvi.lParam=i;
        m_ListSrc.SetItem(&lvi);
        m_ListSrc.GetItem(&lvi);
        afxDump << lvi.lParam << " ";// 0 1 2 3 4 5 6 7 8 9
    }
    afxDump << "\n";
#else
    for(int i=0;i<m_ListSrc.GetItemCount();i++)
    {
        m_ListSrc.SetItemData(i,i);
    }
#endif
//
    m_ListSrc.SortItems(CompareName,nCol);
    *pResult = 0;
}
原來 SetItemData 就是 設置 LVITEM 中的 .lParam !

發佈了32 篇原創文章 · 獲贊 10 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章