给ListCtrl排序方法

本文介绍如何在Windows应用程序中使用列表视图控件实现列排序功能。通过响应LNV_COLUMNCLICK消息,利用回调函数CompareFunc进行表项比较,完成升序或降序排列。此外,还提供了通过按钮触发排序的方法。

列表控制有一个特殊的功能,当以详细资料方式显示时,列表顶部的表头可以当作按钮来使用,这可以通过列表控制创建时的风格来控制。当鼠标点击列表头名称时,列表控制就会向其父窗口发送一个LNV_COLUMNCLICK消息,利用类导向中列表控制IDC_LISTCTRL对应的LNV_COLUMNCLICK消息加入相应处理函数,就可将表列按照特定顺序进行排列。其函数使用方法见程序,其中iSort为排序的表列索引号,(PFNLVCOMPARE)CompareFunc为进行具体排序的回调函数,也就是说,通过鼠标点击表头实现的排序过程是由第三方开发的专用排序函数来实现的,排序函数只是实现表项的具体比较操作,而整个排序过程是由SortItemS属性通过不断调用这个函数来实现的。正常的排序过程是升序方式,通过调换排序函数中的参数值,就可实现降序排列,即将PARAM1与PARAM2调换位置。这个回调函数的前两个参数为表列中表项的索引号,第三个参数为排序的表列索引号。

void   CVCLISTDlg::OnColumnclickListctrl(NMHDR*   pNMHDR,   LRESULT*   pResult)  

{   //鼠标左键单击表头处理函数

NM_LISTVIEW*   pNMListView   =   (NM_LISTVIEW*)pNMHDR;

//   TODO:   Add   your   control   notification   handler   code   here

static   int   iSorted=-1;//排列序号

if   (pNMListView-> iSubItem==iSorted)   return;

iSorted=pNMListView-> iSubItem;

m_ListCtrl.SortItems((PFNLVCOMPARE)CompareFunc,iSorted);

*pResult   =   0;

}

//排序时比较表项的回调函数

int   CALLBACK   CompareFunc(LPARAM   lParam1,   LPARAM   lParam2,LPARAM   lParamSort)

{   char   *text1,*text2;

switch   (lParamSort){

case   0L:text1=Sps[lParam1].szPm;

text2=Sps[lParam2].szPm;break;

case   1L:text1=Sps[lParam1].szSl;

text2=Sps[lParam2].szSl;break;

case   2L:text1=Sps[lParam1].szDj;

text2=Sps[lParam2].szDj;break;

case   3L:text1=Sps[lParam1].szJe;

text2=Sps[lParam2].szJe;break;

}

return   (strcmp(text1,text2));//结果为> 0   =0   <0

}

同样,也可以通过专用按钮来实现排序功能,如本文的排序按钮对应的功能代码如下:

void   CVCLISTDlg::OnSort()  

{   //   TODO:   Add   your   control   notification   handler   code   here

m_ListCtrl.SortItems((PFNLVCOMPARE)CompareFunc,0);}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值