![]() |
#2
聪儿2012-12-03 23:27
比较函数
static int CALLBACK MyCompareProc(LPARAM lParam11, LPARAM lParam12, LPARAM lParam1sort) { int row1=(int )lParam11; int row2=(int )lParam12; CListCtrl *lc =(CListCtrl *)lParam1sort; CString lp1=lc->GetItemText(row1,sort_column); CString lp2=lc->GetItemText(row2,sort_column); if(sort_column==1) if(method[sort_column]) { method[sort_column]=1-method[sort_column]; return atoi(lp1)-atoi(lp2); } else { method[sort_column]=1-method[sort_column]; return atoi(lp2)-atoi(lp1); } else if(sort_column==2) if(method[sort_column]) { method[sort_column]=1-method[sort_column]; return (lp2); } else { method[sort_column]=1-method[sort_column]; return (lp1); } return 0; } 事件响应函数 void CDiagameDlg::OnColumnclickList2(NMHDR* pNMHDR, LRESULT* pResult) { NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; // TODO: Add your control notification handler code here sort_column=pNMListView->iSubItem; // 取得需排序的列号 int count=m_listcontrol.GetItemCount();//行数 int i=0; while(i<3) // 点击第i列后,若method[i]=1时,第i列顺序(逆序)排列,再点击后逆序(顺序)排列,依次循环 { method[i]=1; i++; } for(i=0;i<count;i++) m_listcontrol.SetItemData(i,i); // 设置比较关键字 m_listcontrol.SortItems(MyCompareProc,(DWORD_PTR)&m_listcontrol); *pResult = 0; } 以上为我写的函数,我的表头有三列,想实现的目的是 点击表头实现一次排序,逆序和顺序交替:可是却实现不了我的效果,现在主要问题有两个: 1,第一列无论如何无法实现排序,自己猜想是和 上贴中 红色代码有关,即第一列和其他列数据的插入方法不一样,应该导致了对应属性的某种差别吧。。 2,其他两列点击后的排序非常奇怪,例如,输入数据为“22 88 11 00 44 88 33”,点击一次后排序为“22 00 88 11 88 33 44”再点击一次后为“11 88 22 44 00 88 33”然后为“44 00 33 22 88 11 88”.。。。。完全不知道这么混乱的原因啊,还有时候会出现 两种序列的交替,但是也不是顺序或者逆序, 求大神指点啊。。。 </count;i++) |
我的目的是实现listcontrol中 点击某一列列头时,可以实现本列的排序,再次点击实现逆序排序。
我的代码如下:
全局变量
int sort_column; //标记点击排序的列
int method[100]; //标记排序为逆序或者顺序
int nrow=0;
初始化
m_listcontrol.InsertColumn(0,"count");
m_listcontrol.InsertColumn(1,"input numbers");
m_listcontrol.InsertColumn(2,"results");
CRect userRect;
m_listcontrol.GetClientRect(userRect);
m_listcontrol.SetColumnWidth(0,userRect.Width()/5);
m_listcontrol.SetColumnWidth(1,userRect.Width()/5);
m_listcontrol.SetColumnWidth(2,userRect.Width()*3/5);
添加项目
m_listcontrol.InsertItem(nrow,count);
m_listcontrol.SetItemText(nrow,1,input);
m_listcontrol.SetItemText(nrow,2,output);
nrow++;
[ 本帖最后由 聪儿 于 2012-12-3 23:23 编辑 ]