MFC ListControl 点击列头排序

转:http://blog.sina.com.cn/s/blog_5dc7bbf8010115ak.html

第一步:

定义全局变量:

int sort_column; // 记录点击的列

bool method; // 记录比较方法

第二步:

添加比较函数

1  //  比较函数
2  static int  CALLBACK MyCompareProc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
3  {
4 
5  //  从参数中提取所需比较lc的两行数据
6 
7  int  row1  =  ( int ) lParam1;
8  int  row2  =  ( int ) lParam2;
9 
10  CListCtrl *  lc  =  (CListCtrl * )lParamSort;
11 
12  CString lp1  =  lc -> GetItemText(row1,sort_column);
13  CString lp2  =  lc -> GetItemText(row2,sort_column);
14 
15 
16  //  比较,对不同的列,不同比较,注意记录前一次排序方向,下一次要相反排序
17 
18  if  (sort_column < 2 )
19  {
// int型比较
20  if  (method)
21  return  atoi(lp1) - atoi(lp2);
22  else
23  return  atoi(lp1) - atoi(lp1);
24  }
25  else
26  {
// 文字型比较
27  if  (method)
28  return  lp1.CompareNoCase(lp2);
29  else
30  return  lp2.CompareNoCase(lp1);
31  }
32 
33  return 0 ;
34  }


第三步:添加列头点击事件  Lvn_Columnclick

void  ClistDlg::OnLvnColumnclickxxx(NMHDR  * pNMHDR, LRESULT  * pResult)
{
LPNMLISTVIEW pNMLV
  =  reinterpret_cast < LPNMLISTVIEW > (pNMHDR);
//  TODO: 在此添加控件通知处理程序代码
sort_column  =  pNMLV -> iSubItem;//点击的列

int  count  =  m_list_port.GetItemCount();

for  ( int  i = 0 ;i < count;i ++ )
  m_list_port.SetItemData(i,i);
  //  每行的比较关键字,此处为列序号(点击的列号),可以设置为其他 比较函数的第一二个参数

m_list_port.SortItems(MyCompareProc,(DWORD_PTR)
& m_list_port); // 排序 第二个参数是比较函数的第三个参数

* pResult  = 0 ;
}

完成。

method是用来控制顺序逆序的,看个人情况设置。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值