首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

CListCtrl排序有关问题

2012-03-29 
CListCtrl排序问题int CListCtrlDlg::MyCompareProc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)

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); 

热点排行