MFC ListControl 点击列头排序

来源:互联网 发布:ext js anchor 编辑:程序博客网 时间:2024/05/17 04:53

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

第一步:

定义全局变量:

int sort_column; // 记录点击的列

bool method; // 记录比较方法

第二步:

添加比较函数

1 // 比较函数
2 staticint 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 return0;
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是用来控制顺序逆序的,看个人情况设置。

原创粉丝点击