龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > VC开发 >

在ListCtrl中进行排序

时间:2009-12-30 15:42来源:未知 作者:admin 点击:
分享到:
列表控件(CListCtrl)的顶部有一排按钮,用户可以通过选择不同的列来对记录进行排序。但是 CListCtrl并没有自动排序的功能,我们需要自己添加一个用于排序的回调函数来比较两个数据

  列表控件(CListCtrl)的顶部有一排按钮,用户可以通过选择不同的列来对记录进行排序。但是 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消息进行处理来实现。

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

  //全局数据
  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)
   //}}AFX_MSG
  ...
  };

  //父窗口中包含该CListCtrl派生类对象
  class CSort_in_list_ctrlDlg : public CDialog
  {
  // Construction
   public:
   CSort_in_list_ctrlDlg(CWnd* pParent = NULL); // standard constructor

  // Dialog Data
   //{{AFX_DATA(CSort_in_list_ctrlDlg)
   enum { IDD = IDD_SORT_IN_LIST_CTRL_DIALOG };
   CSortList m_listTest;
   //}}AFX_DATA
  }

  //在父窗口中定义LVN_COLUMNCLICK消息映射
  BEGIN_MESSAGE_MAP(CSort_in_list_ctrlDlg, CDialog)
   //{{AFX_MSG_MAP(CSort_in_list_ctrlDlg)
   ON_NOTIFY(LVN_COLUMNCLICK, IDC_LIST1, OnColumnclickList1)
   //}}AFX_MSG_MAP
  END_MESSAGE_MAP()
  //初始化数据
  BOOL CSort_in_list_ctrlDlg::OnInitDialog()
  {
   CDialog::OnInitDialog();

收藏文章
表情删除后不可恢复,是否删除
取消
确定
图片正在上传,请稍后...
评论内容为空!
还没有评论,快来抢沙发吧!
按钮 内容不能为空!
立刻说两句吧! 查看0条评论
精彩图集

赞助商链接