爲了搞清楚 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 !