简单实现MFC ListControl 点击列头排序

第一步:

定义全局变量:

int sort_column; // 记录点击的列

bool method; // 记录比较方法

第二步:

添加比较函数

1 // 比较函数
2 static int CALLBACKMyCompareProc(LPARAM lParam1, LPARAM lParam2, LPARAMlParamSort)
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); // 排序第二个参数是比较函数的第三个参数

method = !method;
* pResult = 0 ;
}

完成。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值