读书人

CListCtrl排序有关问题

发布时间: 2012-03-29 12:53:12 作者: rapoo

CListCtrl排序问题
int CListCtrlDlg::MyCompareProc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
int row1=(int)lParam1;
int row2=(int)lParam2;
CListCtrl *lc=(CListCtrl*)lParamSort;
CString lp1=lc->GetItemText(row1,sort_column);
CString lp2=lc->GetItemText(row2,sort_column);
if(sort_column<2)
{
if(method)

{
method=FALSE;
return strcmp((char*)(LPCTSTR)lp1,(char*)(LPCTSTR)lp2);
}
else
{
method=TRUE;
return strcmp((char*)(LPCTSTR)lp1,(char*)(LPCTSTR)lp2);
}
}
return 0;
}

为什么只是排序前2项,觉得if中应该来个循环,我想全部排序,应该怎么做,求解?

[解决办法]
listctrl采用的是快速排序,该回调函数会被调用多次,类似于qsort函数的回调函数。从你的代码看,如果对第0和第1列排序,在排序过程中,method在不断变化,会导致错误的结果。
一般升序降序的状态,可以保存到列头CHeaderCtrl中,可以用item的lParam参数保存,排序时通过回调函数的最后一个参数传进去。

如:

C/C++ code
CHeaderCtrl *pHeardCtrl = GetHeaderCtrl();HDITEM hdi;hdi.mask = HDI_LPARAM;pHeardCtrl->GetItem(pNMLV->iSubItem, &hdi);BOOL bASC = (hdi.lParam == 0 ? TRUE : FALSE);    //当前排序方式和上次相反hdi.lParam = bASC;                //保存当前的升降序状态pHeardCtrl->SetItem(pNMLV->iSubItem, &hdi); 

读书人网 >VC/MFC

热点推荐