来源网站:http://blog.csdn.net/hgy413/article/details/6719908

列表控件(CListCtrl)的排序功能不像其它直接调用API就可以完成的功能一样.它比较复杂.今天将我的一点体会简单地谈一下. 列表控件的顶部有一排按钮,用户可以通过选择不同的列来对记录进行排序。但是 CListCtrl并没有自动排序的功能,我们需要自己添加一个用于排序的回调函数来比较两个数据的大小,此外还需要响应排序按钮被点击的消息。回调函数就好像是一个中断处理函数,操作系统在符合你设定的条件时自动调用。 
·CListCtrl提供了用于排序的函数 
函数原型为: 
BOOL CListCtrl::SortItems( PFNLVCOMPARE pfnCompare, DWORD dwData); 
其中第一个参数为全局排序函数(它就是回调函数)的地址, 
第二个参数为用户数据,你可以根据你的需要传递一个数据或是指针。 
该函数返回-1,代表第一项排应在第二项前面; 
返回1代表第一项排应在第二项后面; 
返回0代表两项相等。·排序函数原形为: 
int CALLBACK ListCompare(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort); 
其中第三个参数为调用者传递的数据(即调用SortItems时的第二个参数dwData)。 
第一和第二个参数为用于比较的两项的ItemData,你可以通过DWORD CListCtrl::GetItemData( int nItem )/ 
BOOL CListCtrl::SetItemData( int nItem, DWORD dwData )来对每一项的ItemData进行存取。在添加项时选用特定的CListCtrl::InsertItem也可以设置该值。由于你在排序时只能通过该值来确定项的位置所以你应该比较明确的确定该值的含义。 
·我们什么时候需要排序(消息映射)呢? 
实现这点可以在父窗口中对LVN_COLUMNCLICK消息进行处理来实现。

例子:

//排序回调函数实现
static int CALLBACK MyCompareProc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
<span style="white-space:pre"> </span>// lParamSort contains a pointer to the list view control.
<span style="white-space:pre"> </span>// The lParam of an item is just its index.
<span style="white-space:pre"> </span>//以第一列为根据排序
<span style="white-space:pre"> </span>CListCtrl* pListCtrl = (CListCtrl*) lParamSort;
<span style="white-space:pre"> </span>CString strItem1 = pListCtrl->GetItemText(lParam1, 0);
<span style="white-space:pre"> </span>CString strItem2 = pListCtrl->GetItemText(lParam2, 0);
//比较两个数
<span style="white-space:pre"> </span>LPCTSTR s1=(LPCTSTR)strItem1;
<span style="white-space:pre"> </span>LPCTSTR s2=(LPCTSTR)strItem2; <span style="white-space:pre"> </span>int n1=atoi(s1);
<span style="white-space:pre"> </span>int n2=atoi(s2);if (n1>n2)
<span style="white-space:pre">     </span>return -1;
<span style="white-space:pre"> </span>else
<span style="white-space:pre">     </span>return 1;
}
<span style="white-space:pre"> </span>void C***::OnColumnclickList(NMHDR* pNMHDR, LRESULT* pResult)
{
<span style="white-space:pre"> </span>NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
<span style="white-space:pre"> </span>// TODO: Add your control notification handler code here //调用排序函数
<span style="white-space:pre"> </span>m_ShowData.SortItems( MyCompareProc, (DWORD)&m_ShowData );
<span style="white-space:pre"> </span>*pResult = 0;}

整个过程是这样的: 当你点击列表控件的表头时,此时它会向父窗口发送LVN_COLUMNCLICK消息,此时响应函数OnColumnclickList(),在该函数里面再调用列表控件的SortItems()成员函数,它会自动调用排序函数,完成排序功能.

首先,要让CListCtrl能响应点击Column header的操作,方法是响应对应的LVN_COLUMNCLICK消息,然后在对应的消息处理函数中执行自己的排序。其方法是调用CListCtrl 类中的成员函数SortItems()函数,不过在调用之前,依据msdn的指示,一定要对所有需要排序的行调用CListCtrl的 SetItemData( int nItem, DWORD dwData )函数,一般的设置方法为:
for(int i = 0; i < listCtrl.GetItemCount(); ++i)
{
SetItemData(i,i);
}
这样写的原因下面马上就会指出。
接下来就是调用CListCtrl的排序函数SortItems( PFNLVCOMPARE pfnCompare, DWORD dwData ),其中第一个参数为比较函数(回调函数),其函数格式按照msdn上的说法应该为:
int CALLBACK listCompare(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort); 
这里的lParam1和lParam2都是系统传给这个回调函数的,具体数值就是上面SetItemData函数中的dwData,第二个参数是输入给这个回调函数的一个参数,一般都是对应CListCtrl对象的指针
最后就是实现那个回调函数了,msdn上说这个函数必须为独立的函数,或者是某个类中的静态函数,这点注意一下即可,以下为一个具体的回调函数的例子:

///
//按第六列排序
int CALLBACK listCompare(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
CListCtrl* pListCtrl = (CListCtrl*)lParamSort;
CString strItem1 = pListCtrl->GetItemText(lParam1,5);
CString strItem2 = pListCtrl->GetItemText(lParam2,5);
LVCOLUMN Vol;
CString csStr("");
TCHAR szCol[MAX_PATH];
Vol.pszText = szCol;
Vol.mask=LVCF_TEXT;
Vol.cchTextMax=sizeof(szCol);
pListCtrl->GetColumn(0,&Vol);
csStr = CString(Vol.pszText); if (csStr.Right(1) == CString("▼"))
{
return _tcscmp(strItem2.GetBuffer(MAX_PATH),strItem1.GetBuffer(MAX_PATH));
}
else if (csStr.Right(1) == CString("▲"))
{
return _tcscmp(strItem1.GetBuffer(MAX_PATH),strItem2.GetBuffer(MAX_PATH));
}
else
{
return _tcscmp(strItem1.GetBuffer(MAX_PATH),strItem2.GetBuffer(MAX_PATH));
}
}
///
void CManageView::OnColumnclick(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
// TODO: Add your control notification handler code here
CListCtrl &m_ListCtrl = GetListCtrl();for(int i = 0; i < m_ListCtrl.GetItemCount(); ++i)
m_ListCtrl.SetItemData(i,i);
m_ListCtrl.SortItems(listCompare,(LPARAM)&m_ListCtrl);*pResult = 0;
} 

转载于:https://www.cnblogs.com/lovelyx/p/4867143.html

CListCTrl控件排序(一)相关推荐

  1. CListCtrl控件使用指南(大全)

    ---------------------------------------------------------------------------------------------------- ...

  2. CListCtrl控件详解

    1.视图类别 列表视图控件可用四种不同方式显示其内容,称之为"视图",有以下四个类别: 图标视图:每一项以全尺寸图标(32×32像素)出现,下面有一个标签.用户可在列表视图窗口拖动 ...

  3. MFC CListCtrl控件基本使用图解

    新建一个对话框工程:添加CListCtrl控件:为控件添加成员变量,如下图: 成员变量名称,m_ctrllist: 如下图,找到对话框初始化成员函数,转到定义,进入此函数代码: 找到 // TODO: ...

  4. CListCtrl控件

    CListCtrl控件在数据库编程中是用得比较多的控件之一,也是Window控件中较难掌握的一个控件.他可以有四显示方式 1:报告显示方式 在Report方式中,列表控件的显示方式是有行和列的,行有叫 ...

  5. VC MFC列表视图(CListCtrl)控件

    VC MFC列表视图(CListCtrl)控件 列表视图控件 图标风格 CListCtrl类里要了解的函数 SetImageList为列表控件关联一个图像列表 InsertItem插入一项 GetSe ...

  6. MFC_C++02_模态对话框,非模态对话框,StaticText静态文本,CEditCtrl控件,ComboBox下拉框,CListCtrl控件,CTreeCtrl 树控件,TabCtrl标签控件

    01 模态对话框创建 更改标题名: 菜单栏 --> 视图->工具箱 ,找到工具箱 导入两个按钮: 准备对话框: 插入就可以了,更改名称 双击按钮,可以进入点击事件 创建控件的类:右击-&g ...

  7. CListCtrl控件中InsertItem和SettItemtext函数的用法简介

    本人初次用CListCtrl控件的时候,对于 InsertItem和SetrtItemtext两个函数的作用始终不是太懂,比如如果不先调用InsertItem这个函数,后面的InsertItemtex ...

  8. CListCtrl控件中InsertItem和SetItemText函数

         本人初次用CListCtrl控件的时候,对于 InsertItem和SetItemText两个函数的作用始终不是太懂,比如如果不先调用InsertItem这个函数,后面的SetItemT ...

  9. CListCtrl控件的InsertItem和SetItemText和SetItem三个函数的区别

    CListCtrl控件的InsertItem和SetItemText和SetItem三个函数的区别 分类: vc 2013-03-17 08:21  1548人阅读  评论(0)  收藏  举报 本人 ...

最新文章

  1. c++:结构体的应用
  2. vue3.0js 非prop属性的值和setup函数的使用
  3. 实现了某一个接口的匿名类的例子_java中的内部类内部接口详解,一文搞定
  4. Oracle收集用户的权限
  5. 如何用 JavaScript+Canvas 开发一款超级烧脑小游戏?
  6. 进程间通信方式 超详细解析全站最全
  7. 经典python题目练习
  8. 计步算法 睡眠 心率 学习 PPG传感器(转))
  9. 让你的 commit 更有价值(规范)
  10. sum多个字段的值相加_Excel Sumifs函数多字段多条件求和使用实例
  11. 平板用电容笔还是触控笔?双十一值得买电容笔推荐
  12. win10禁用笔记本原本键盘
  13. 并发用户数,吞吐量计算公式
  14. 分享一篇父母对孩子教育方法的文章
  15. GlidedSky爬虫雪碧图-1
  16. Fegin远程调用示例实战
  17. csr_matrix矩阵压缩
  18. [JavaScript]_[初级]_[使用HTMLElement.dataset快速读写自定义属性]
  19. 15款好用的效果图设计制作软件推荐
  20. 相关-10. 万能近似定理(universal approximation theorem)

热门文章

  1. NumberOf1Bits(leetcode191)
  2. PHP动物书总结14-17
  3. monkey测试===如何获取android app的Activity
  4. UEditor文本浏览器,引号加斜杠解决
  5. Python+PyQt 数据库基本操作
  6. windows系统连接***后不能上网
  7. 【00】设计模式概要
  8. SOA:A note on RPC
  9. linux crond命令
  10. zabbix入门到精通之--zabbix proxy配置(二)