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); 
posted @ 2011-04-27 20:53  MagiCube  阅读(8813)  评论(0编辑  收藏  举报