点击表头排序整体的思路都是去 CListCtrl类中的方法SortItems去实现

CListCtrl::SortItems的原型是:

BOOL SortItems( PFNLVCOMPARE pfnCompare, DWORD dwData );

第一个参数pfnCompare为回调函数,形式为:
int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort);

lParam1,lParam2是什么?这是SortItems难理解的原因。

简单的说:是LV_ITEM::lParam。
LV_ITEM是个结构,见msdn。

可见,我们在向CListCtrl插入item时,必须使用
int InsertItem( const LVITEM* pItem );
InsertItem有好几种形式,只有这种形式才能够使用LV_ITEM::lParam。

下面是插入item的代码的一个示例:

tagInfo *pFileInfo = new tagInfo;//tagInfo是个结构,存储了你排序的所需要的信息。
    pFileInfo->strFileName = strFileName;
    pFileInfo->strFileSize = FormatFileSize(filefind.GetLength());
    pFileInfo->strFileType = GetTypeName(lpszFileName);
    //pFileInfo->strFilePath = strPath;

    int nItem = GetItemCount();
    int nIcon = GetIconIndex(lpszFileName, filefind.IsDirectory(), FALSE);   
    
     LV_ITEM lvi;
    lvi.mask = LVIF_TEXT|LVIF_PARAM|LVIF_IMAGE;
    lvi.iItem = nItem;
    lvi.iSubItem = 0;
    lvi.pszText = (LPTSTR)(LPCTSTR)pFileInfo->strFileName;
    lvi.lParam = (LPARAM)pFileInfo;
    lvi.iImage = nIcon;
    
        if( (nItem = InsertItem(&lvi)) != -1 )//插入文件名(即第0列),并显示相应图标
    {    
        //MessageInt(nItem);
        lvi.mask = LVIF_TEXT;        
        lvi.iItem = nItem;

        //设置第1列(即设置文件大小)        
        lvi.iSubItem = 1;            
        if(!filefind.IsDirectory())//如果不是目录
        {    
            lvi.pszText = (LPTSTR)(LPCTSTR)pFileInfo->strFileSize;
            SetItem( &lvi );
        }
        else//如果是目录
        {        
            lvi.pszText = (LPTSTR)YCT_UNKNOW_SIZE;
            SetItem( &lvi );
        }                    
                
        //设置第2列(即设置文件类型)
        lvi.iSubItem = 2;
        lvi.pszText = (LPTSTR)(LPCTSTR)pFileInfo->strFileType;
        SetItem( &lvi );

        //设置第3列(即设置文件所在目录)
        lvi.iSubItem = 3;
        lvi.pszText = (LPTSTR)(LPCTSTR)strPath;
        SetItem( &lvi );

        //更新界面
        //Update( lvi.iItem );
    }

第二个参数dwData为用户自定义值。
dwData实际传入的是列数,等于1)中的lParamSort。

void CUpListCtrl::OnColumnclick(NMHDR* pNMHDR, LRESULT* pResult) 
{
        NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;

        //排序
        //CompareFunc是回调函数
        //pNMListView->iSubItem就是列数

   SortItems( (PFNLVCOMPARE)CompareFunc, pNMListView->iSubItem );

        *pResult = 0;
}

现在lParam指向的是new出来的空间,当然要用delete删除。以下是删除代码:

//LVN_DELETEITEM消息响应函数
//每删除一个item,系统都要自动调用这个函数的
void CUpListCtrl::OnDeleteitem(NMHDR* pNMHDR, LRESULT* pResult) 
{
    NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;

    //删除LV_ITEM::lParam所指向的空间
    LV_ITEM lvi;
    lvi.mask = LVIF_PARAM;
    lvi.iItem = pNMListView->iItem;
    lvi.iSubItem = 0;
    if ( GetItem( &lvi ) )
    {
        CUpListCtrl::tagInfo* pInfo = (CUpListCtrl::tagInfo*)(lvi.lParam);
        delete pInfo;
    }
    
    *pResult = 0;
}

(三)编写回调函数

这个就比较简单了,按你的规则排序就可以了。
这里回调函数是个静态成员函数。

int CALLBACK CUpListCtrl::CompareFunc(CUpListCtrl::tagInfo* pInfo1, CUpListCtrl::tagInfo* pInfo2, LPARAM lCol)
{
//CListCtrl::SortItems使用的回调函数
//[IN]pInfo1,pInfo2:传入的是LV_ITEM::lParam,在调用InsertItem(const LVITEM* pItem)时指定
//[IN]lCol:指定列数(从零开始),即按哪一列排序


    int nRet = 0;
    ASSERT(lCol>=0 && lCol<NumCol-1);
    ASSERT(pInfo1 != NULL);
    ASSERT(pInfo2 != NULL);
    switch(lCol)
    {
    case 0://0列
            //自己按0列规则排序代码
                //想要pInfo1(所代表的item)排在pInfo2(所代表的item)之前,则nRet小于0;反之大于0;顺序不变等于0
        break;
    case 1://1列

        //自己按1列规则排序代码
                //...
        break;
    }

    return nRet;
}

  我会在下两篇讲解如何去实现排序

CList 点击表头排序 (2)两种排序方法中其中一种

CList 点击表头排序 (3)两种排序的第二种

转载于:https://www.cnblogs.com/ye-ming/p/9262819.html

CList 点击表头排序 (1)SortItems函数相关推荐

  1. 用面对对象的方式点击表头排序

    图片样式为这个,Table是用js动态创建的,要求为点击表头排序 这里是css样式 <!DOCTYPE html><html lang="en"><h ...

  2. php 点击表头排序,点击表头切换升降序排序方式

    需求: 在报表的实际应用中有很多客户希望可以通过点击表头切换该列数据的排序. 实现方式: 超链接结合参数以及单元格表达式来实现,具体举例如下 原表样如下 实现原理:通过点击第一行任意格的值,通过 A2 ...

  3. Qt自定义点击表头排序,使支持恢复默认顺序

    0.前言 之前总结了 QTableView 实现排序 ,但是这里还有个问题,就是 Qt 默认的排序状态只有升序和降序,没法通过点击表头恢复到默认的顺序,他这个 SortOrder 宏也只有升序降序两个 ...

  4. php 点击表头排序,TP5+ajax实现点击表格表头切换排序,带分页

    TP5+ajax实现点击表格表头切换排序,带分页 2018-08-15 14:59:06ThinkPHP php接收页码请求的地址 /** * ajax 无刷新分页 * param $page int ...

  5. 点击表头排序的几种方法 动态表格

    我记得老早老早大家就开始在经典讨论表格排序的问题了,过了这么多年,这个问题的解决方案层出不穷,见仁见智. 用script,htc,xml+xsl等等怎么着都能实现,只是效率不同罢了. 今天正好学习.n ...

  6. php liger 表格排序,LigerUI之grid表格点击表头标题排序实现

    LigerUI之grid表格点击表头标题排序实现: 通过ajax方式加载数据之后,点击表头排序两种方式实现. 第一种: grid.set({ dataAction: 'local', url: '', ...

  7. element Table表格实现前x行恒展示,不会被折叠,设置点击表头按钮排序。

    table表格前X行恒展示不会被折叠. 表头筛选按钮示意图: // data --渲染的数据(每一列每一行),请求回来的. 默认通过字段名和每一个headers对象中每一个prop来对应起来渲染数据的 ...

  8. QT中QTableView 点击表头进行排序

    今日,由于工作需要,要实现在QTableView中点击表头进行排序的功能,但QTableView中并未提供此功能,经过苦苦的网络搜索也为发现可用的代码.最后经过跟踪QTableWidget的排序功能实 ...

  9. java点击表头可进行排序_table中点击表头实现排序的功能示例介绍

    表头名字,页面中获取上次点击的表头的名称和这次点击的表头的名称做比较,如果两者相同就按原先相反的顺序排列,否则新列升序排列, 获取排列顺序的列名及排列顺序以后,传到后台获取相应sql,添加order ...

最新文章

  1. ArcGIS_系列中文教程下载
  2. java 为什么重写equals一定要重写hashcode?
  3. adb打开网页_adb命令打开手机设置页面
  4. [每天进步一点 -- 流水账]第1周
  5. ubuntu中提示找到make命令的解决方案
  6. QT中如果出现: warning: 'nullptr' is incompatible with C++98等类似警告
  7. c语言统计计算机专业人数,非计算机专业C语言练习题及2013版中国统计年鉴1.doc...
  8. ext数据库读取动态添加window组件
  9. c语言电子钢琴课程设计,单片机课程设计(电子琴).doc
  10. java saxreader 生成xml_SAXReader解析xml文件demo
  11. 百度AI图像识别——红酒识别、货币识别、车辆检测等
  12. CEVA-DSP构成
  13. 宝可梦 序列号认证服务器发生了错误,宝可梦探险寻宝无法连接服务器是什么原因...
  14. 技术交流:springboot配置阿里云日志服务与log4j2 lookup
  15. 青海湖:月光尽情倾洒惹人念
  16. 有位置,来,搬个小板凳,喝酒听故事!
  17. 浏览器页签icon图标的设置和获取
  18. mysql数据库 笔试题
  19. ByteCTF2021安全范儿高校挑战赛线上Misc-《HearingNotBelieving》
  20. i春秋之SQL(详细WP)

热门文章

  1. 谷歌三驾马车将成历史,创始人退位,皮查伊兼任母公司CEO
  2. 人脸识别屡遭非议,会成为“潘多拉魔盒”吗?
  3. file的open()和read()
  4. linux 脚本 lang,golang可以编写shell脚本吗
  5. mybatis动态代理
  6. css层叠上下文详解,CSS定位(层叠上下文)
  7. 架构 php_十年PHP架构师的成长之路,程序员必备
  8. idea创建maven项目的路径
  9. php唯一性查询,ThinkPHP5.0数据更新验证唯一性怎么验证。
  10. Smoke Test与Ad hoc Test