CListCtrl::SortItems的用法
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使用的地方:
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的代码的一个示例:
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删除。以下是删除代码:
//每删除一个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的用法相关推荐
- CListCTrl控件排序(一)
来源网站:http://blog.csdn.net/hgy413/article/details/6719908 列表控件(CListCtrl)的排序功能不像其它直接调用API就可以完成的功能一样.它 ...
- CList 点击表头排序 (1)SortItems函数
点击表头排序整体的思路都是去 CListCtrl类中的方法SortItems去实现 CListCtrl::SortItems的原型是: BOOL SortItems( PFNLVCOMPARE pfn ...
- CListCtrl的使用完全指南
CListCtrl的使用完全指南 http://www.programbbs.com/doc/2887.htm 所属类别:VC++ 推荐指数:★★★☆ 文档人气:18717 本周人气:22 发布日期: ...
- 报表式CListCtrl的使用详解初稿
创建图形列表并和CListCtrl关联: m_image_list.Create(IDB_CALLER2, 16, 10, RGB(192,192, 192)); m_image_list.SetBk ...
- CListCtrl控件的使用指南 (转)
创建图形列表并和CListCtrl关联: m_image_list.Create(IDB_CALLER2, 16, 10, RGB(192,192, 192)); m_image_list.SetBk ...
- CListCtrl使用指南
2007-06-05 17:24 创建图形列表并和CListCtrl关联: m_image_list.Create(IDB_CALLER2, 16, 10, RGB(192,192, 192)); m ...
- 20200220MFC 之CListCtrl(二)
本文根据本人在项目中的应用,来谈谈CListCtrl的部分用法及技巧.当初学习时,查了很多资料,零零碎碎的作了些记录,现在主要是来做个总结,方便以后查阅.主要包括以下十三点内容:基本操作.获取选中行的 ...
- CListCtrl控件使用
创建图形列表并和CListCtrl关联: m_image_list.Create(IDB_CALLER2, 16, 10, RGB(192,192, 192)); m_image_list.Se ...
- CListCtrl(clistctrl获取选中行数据)
如何获取CListCtrl当前选中的行 方法一: 单选的情况下 GetNextItem(-1,LVIS_SELECTED); 方法二:单选的情况下 如果只允许单选,只需要调用成员函数GetSelect ...
最新文章
- PyTorch迎来5岁生日,创始人带领大一实习生开发:没想到会这么成功
- pycharm 调试错误 Connection to Python debugger failed: Socket operation on nonsocket: configureBlocking
- getservbyname和getservbyport
- 模拟实现strstr
- 在《糖豆人》身上,我们看到了竞技游戏火爆的六大因素
- C#操作Excel文件暨C#实现在Excel中将连续多列相同数据项合并
- 祝各位网友儿童节快乐!
- J2EE事务并发控制策略总结
- 基本数据类型的包装类和随机数
- 【论文解读】知识图谱最新研究综述
- c语言中编译链接机制
- Python经典前端框架:Django,第一天【Django环境搭建】
- python pytz下载_python:pytz包安装问题:ImportError:没有名为pytz的模块
- 【UE4】WebUI插件实现HTML透明区域事件穿透响应
- R语言之管道符的使用和学习
- 数据可视化--实验五:高维非空间数据可视化
- 实体服务器搭建vps系统,vps系统和云服务器搭建
- ilove中文_iLovePDF中文版|iLovePDF(PDF万能工具箱) V0.9.662 官方版 下载_当下软件园_软件下载...
- 短视频在线去水印 视频伪原创批量处理工具
- 最实用的深度学习教程 Practical Deep Learning For Coders (Kaggle 冠军 Jeremy Howard 亲授)
热门文章
- (转)【译】优化你的手机游戏(没有延迟的,才是健康的)
- 常见的Web应用中间件(基于Linux)
- 0x00007FFBD3780C0C (opencv_world341d.dll)处(位于 Project7.exe 中)引发的异常: 0xC0000005: 写入位置 0x0000000000000
- Ubuntu18.04安装mysql并登录(版本5.7)
- GIS数据下载网址大全
- 牛客网 c++ 剑指Offer_编程题 第五题用两个栈实现队列
- matlab fft 幅度,相位
- 45天学会go --第2天go语言基本数据类型
- python-双均线系统-参数优化
- 美国历任总统的演讲视频