【转帖】VC中使CListCTrl控件排序

 

http://blog.sina.com.cn/s/blog_5baa65b30100ahxm.html

VC中使CListCTrl控件排序(2008-09-26 18:41:19)标签:杂谈   分类:软件开发

   列表控件(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)
{
//   lParamSort   contains   a   pointer   to   the   list   view   control.
//   The   lParam   of   an   item   is   just   its   index.  
//以第一列为根据排序
CListCtrl*   pListCtrl =   (CListCtrl*)   lParamSort;
CString      strItem1   =   pListCtrl->GetItemText(lParam1,   0);
CString      strItem2   =   pListCtrl->GetItemText(lParam2,   0);
    //比较两个数
LPCTSTR   s1=(LPCTSTR)strItem1;
LPCTSTR   s2=(LPCTSTR)strItem2;
  
int   n1=atoi(s1);
int   n2=atoi(s2);

if   (n1>n2)
        return   -1;
else   
        return   1;  
}


void C***::OnColumnclickList(NMHDR* pNMHDR, LRESULT* pResult)
{
   NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
   // TODO: Add your control notification handler code here

   //调用排序函数
   m_ShowData.SortItems( MyCompareProc, (DWORD)&m_ShowData );      
   *pResult = 0;

}

 

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值