在ListCtrl中进行排序

swyswyg

swyswyg

2016-02-19 14:28

下面是个超简单的在ListCtrl中进行排序教程,图老师小编精心挑选推荐,大家行行好,多给几个赞吧,小编吐血跪求~

  列表控件(CListCtrl)的顶部有一排按钮,用户可以通过选择不同的列来对记录进行排序。但是 CListCtrl并没有自动排序的功能,我们需要自己添加一个用于排序的回调函数来比较两个数据的大小,此外还需要响应排序按钮被点击的消息。下面讲述一下具体的做法。

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)

  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消息进行处理来实现。

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)

  下面我们看一个例子,这个例子是一个派生类,并支持顺序/倒序两种方式排序。为了简单我对全局数据进行排序,而在实际应用中会有多组需要排序的数据,所以需要通过传递参数的方式来告诉派序函数需要对什么数据进行排序。

  //全局数据
  struct DEMO_DATA
  {
     char szName[20];
     int iAge;
  }strAllData[5]={{"王某",30},{"张某",40},{"武某",32},{"陈某",20},{"李某",36}};

  //CListCtrl派生类定义
  class CSortList : public CListCtrl
  {
  // Construction
  public:
   CSortList();
   BOOL m_fAsc;//是否顺序排序
   int m_nSortedCol;//当前排序的列
  protected:
   //{{AFX_MSG(CSortList)
   /

展开更多 50%)
分享

猜你喜欢

在ListCtrl中进行排序

编程语言 网络编程
在ListCtrl中进行排序

在Word2024中进行邮件合并收件人排序

word
在Word2024中进行邮件合并收件人排序

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

在Word2010中进行邮件合并收件人排序

电脑入门
在Word2010中进行邮件合并收件人排序

在CB中进行DirectX编程(3)

编程语言 网络编程
在CB中进行DirectX编程(3)

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

在CB中进行DirectX编程(1)

编程语言 网络编程
在CB中进行DirectX编程(1)

怎样在Word2024中进行逆序打印

word
怎样在Word2024中进行逆序打印

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

VC学习:Windows CE下的串口通讯类

VC学习:Windows CE下的串口通讯类

VC学习:全局共享变量的困惑

VC学习:全局共享变量的困惑
下拉加载更多内容 ↓