CListCtrl的SetItemData
同学在写一个CListCtrl控件的排序方法时,
CListCtrl m_wndListCtrl; //初始化控件 m_wndListCtrl.Init(); int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) { //获得列表控件 CListCtrl* pListCtrl = (CListCtrl*)lParamSort; CString strItem1 = pListCtrl->GetItemText(lParam1, 0); CString strItem2 = pListCtrl->GetItemText(lParam2, 0); return strcmp(strItem2, strItem1); } void CDemoDlg::OnColumnclickList(NMHDR* pNMHDR, LRESULT* pResult) { //排序表项 m_wndListCtrl.SortItems(CompareFunc, LPARAM(&m_ctrlList)); }排序函数CompareFunc中的参数lParam1和lParam2的值一直是0,所以无法正确进行排序,到网上一查才知道,原来要想使用LPARAM这个参数,就必须调用CListCtrl的SetItemData方法,该方法的原型为:BOOL SetItemData(int nItem,DWORD_PTR dwData );其中,nItem是CListCtrl的行,dwData是一个32位的值,这个值是和该行相绑定的。通常这个值是作为lparam使用。
如果不使用SetItemData设置时,默认的lparam都是0,所以同学在排序的时候lParam1和lParam2一直是0。
故只要在Init()中添加下述代码就可以正确实现排序了:
for(int i=0;i <m_wndListCtrl.GetItemCount();i++) m_wndListCtrl.SetItemData(i,i);