CListCtrl::SortItems的用法:

(一)SortItems使用在哪?

CListCtrl::SortItems的原型是:
BOOL SortItems( PFNLVCOMPARE pfnCompare, DWORD dwData );
其中
1)第一个参数pfnCompare为回调函数,形式为:
int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2,
   LPARAM lParamSort);

lParam1,lParam2是什么?这是SortItems难理解的原因。在(二)中介绍。
lParamSort实际上是列数,等于2)中的dwData。
2)第二个参数dwData为用户自定义值。
dwData实际传入的是列数,等于1)中的lParamSort。

下面是SortItems使用的地方:

//LVN_COLUMNCLICK消息响应函数
void CUpListCtrl::OnColumnclick(NMHDR* pNMHDR, LRESULT* pResult) 
...{
        NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;

        //排序
        //CompareFunc是回调函数
        //pNMListView->iSubItem就是列数
        SortItems( (PFNLVCOMPARE)CompareFunc, pNMListView->iSubItem );

        *pResult = 0;
}

(二)SortItems的的回调函数的中的lParam1,lParam2是什么?

简单的说:是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 );
    }

现在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;
}

CListCtrl::SortItems的用法相关推荐

  1. CListCTrl控件排序(一)

    来源网站:http://blog.csdn.net/hgy413/article/details/6719908 列表控件(CListCtrl)的排序功能不像其它直接调用API就可以完成的功能一样.它 ...

  2. CList 点击表头排序 (1)SortItems函数

    点击表头排序整体的思路都是去 CListCtrl类中的方法SortItems去实现 CListCtrl::SortItems的原型是: BOOL SortItems( PFNLVCOMPARE pfn ...

  3. CListCtrl的使用完全指南

    CListCtrl的使用完全指南 http://www.programbbs.com/doc/2887.htm 所属类别:VC++ 推荐指数:★★★☆ 文档人气:18717 本周人气:22 发布日期: ...

  4. 报表式CListCtrl的使用详解初稿

    创建图形列表并和CListCtrl关联: m_image_list.Create(IDB_CALLER2, 16, 10, RGB(192,192, 192)); m_image_list.SetBk ...

  5. CListCtrl控件的使用指南 (转)

    创建图形列表并和CListCtrl关联: m_image_list.Create(IDB_CALLER2, 16, 10, RGB(192,192, 192)); m_image_list.SetBk ...

  6. CListCtrl使用指南

    2007-06-05 17:24 创建图形列表并和CListCtrl关联: m_image_list.Create(IDB_CALLER2, 16, 10, RGB(192,192, 192)); m ...

  7. 20200220MFC 之CListCtrl(二)

    本文根据本人在项目中的应用,来谈谈CListCtrl的部分用法及技巧.当初学习时,查了很多资料,零零碎碎的作了些记录,现在主要是来做个总结,方便以后查阅.主要包括以下十三点内容:基本操作.获取选中行的 ...

  8. CListCtrl控件使用

     创建图形列表并和CListCtrl关联: m_image_list.Create(IDB_CALLER2, 16, 10, RGB(192,192, 192)); m_image_list.Se ...

  9. CListCtrl(clistctrl获取选中行数据)

    如何获取CListCtrl当前选中的行 方法一: 单选的情况下 GetNextItem(-1,LVIS_SELECTED); 方法二:单选的情况下 如果只允许单选,只需要调用成员函数GetSelect ...

最新文章

  1. PyTorch迎来5岁生日,创始人带领大一实习生开发:没想到会这么成功
  2. pycharm 调试错误 Connection to Python debugger failed: Socket operation on nonsocket: configureBlocking
  3. getservbyname和getservbyport
  4. 模拟实现strstr
  5. 在《糖豆人》身上,我们看到了竞技游戏火爆的六大因素
  6. C#操作Excel文件暨C#实现在Excel中将连续多列相同数据项合并
  7. 祝各位网友儿童节快乐!
  8. J2EE事务并发控制策略总结
  9. 基本数据类型的包装类和随机数
  10. 【论文解读】知识图谱最新研究综述
  11. c语言中编译链接机制
  12. Python经典前端框架:Django,第一天【Django环境搭建】
  13. python pytz下载_python:pytz包安装问题:ImportError:没有名为pytz的模块
  14. 【UE4】WebUI插件实现HTML透明区域事件穿透响应
  15. R语言之管道符的使用和学习
  16. 数据可视化--实验五:高维非空间数据可视化
  17. 实体服务器搭建vps系统,vps系统和云服务器搭建
  18. ilove中文_iLovePDF中文版|iLovePDF(PDF万能工具箱) V0.9.662 官方版 下载_当下软件园_软件下载...
  19. 短视频在线去水印 视频伪原创批量处理工具
  20. 最实用的深度学习教程 Practical Deep Learning For Coders (Kaggle 冠军 Jeremy Howard 亲授)

热门文章

  1. (转)【译】优化你的手机游戏(没有延迟的,才是健康的)
  2. 常见的Web应用中间件(基于Linux)
  3. 0x00007FFBD3780C0C (opencv_world341d.dll)处(位于 Project7.exe 中)引发的异常: 0xC0000005: 写入位置 0x0000000000000
  4. Ubuntu18.04安装mysql并登录(版本5.7)
  5. GIS数据下载网址大全
  6. 牛客网 c++ 剑指Offer_编程题 第五题用两个栈实现队列
  7. matlab fft 幅度,相位
  8. 45天学会go --第2天go语言基本数据类型
  9. python-双均线系统-参数优化
  10. 美国历任总统的演讲视频