CList 点击表头排序 (2)两种排序方法中其中一种
上一篇讲解SortItem()方法如何使用,虽然都是抄别人的但是就是想让大家有个大概的了解
点击表头排序基本思路都是
1.首先响应HDN_ITEMCLICK 消息来获取点击表头的位置
2.设置结构体来存储排序信息,结构体信息主要有三个 (1)CListCtrl的指针,(2)点击第几列的列数,(3)排序,主要以int型为主
3.获取当前行的内容和下一行的内容
4.使用SortItems函数来进行排序,SortItems函数如何使用我在上一篇已经提到CList 点击表头排序 (1)SortItems函数
第一种排序是使用SetItemDate和GetItemDate来进行位置的定位和要比对的单元格的内容的获取,缺点是如果你要想使用SetItemDate存放个数据的话,例如结构体,那么排序则会失效
(1)首先响应消息ON_NOTIFY(HDN_ITEMCLICK, 0, &CFinishWellToFind::OnLvnColumnclickListFinishWell)
(2)实现方法
void CFinishWellToFind::OnLvnColumnclickListFinishWell(NMHDR *pNMHDR, LRESULT *pResult)
{
////排序第一种
NMLISTVIEW *pLV = (NMLISTVIEW *) pNMHDR;
//int column and asc
static int sSortColumn = 0;
//init New head ctrl,让它不显示上下三角
HDITEM hdrItem;
//int iColumn = pLV->iSubItem;
m_ListCtrl.GetHeaderCtrl()->GetItem(sSortColumn, &hdrItem);
hdrItem.mask = HDI_FORMAT;
hdrItem.fmt &= ~(HDF_SORTDOWN | HDF_SORTUP);
m_ListCtrl.GetHeaderCtrl()->SetItem(sSortColumn, &hdrItem);
//make Asc
//点击相同列,排序方式变反。
//点击不同列,升序排列
static int nAsc = 1;
if(sSortColumn == pLV->iItem)
{
nAsc = - nAsc;
}
else
{
sSortColumn = pLV->iItem;
nAsc = 1;
}
//init new head ctrl,显示上三角或下三角
m_ListCtrl.GetHeaderCtrl()->GetItem(sSortColumn, &hdrItem);
hdrItem.mask = HDI_FORMAT;
if(nAsc == 1)
{
hdrItem.fmt |= HDF_SORTUP;
hdrItem.fmt &= ~HDF_SORTDOWN;
}
else
{
hdrItem.fmt |= HDF_SORTDOWN;
hdrItem.fmt &= ~HDF_SORTUP;
}
m_ListCtrl.GetHeaderCtrl()->SetItem(sSortColumn, &hdrItem);
PSORTDATA pSortData = new SORTDATA;
pSortData->nAsc = nAsc;
pSortData->pList = &m_ListCtrl;
pSortData->nSubItem = sSortColumn;
m_ListCtrl.SortItems(SortFunc,(DWORD_PTR)pSortData);
}
(3)内容绑定 注*如果缺少内容绑定的话,则排序一定不会成功
其中,nItem是CListCtrl的行,dwData是一个32位的值,这个值是和该行相绑定的。通常这个值是作为lparam使用。
如果不使用SetItemData设置时,默认的lparam都是0,所以同学在排序的时候lParam1和lParam2一直是0。
故只要在Init()中添加下述代码就可以正确实现排序了:
m_ListCtrl.SetItemData(i,i);
(3)实现内容比对方法
int CALLBACK SortFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
PSORTDATA pSortData = (PSORTDATA) lParamSort;
CListCtrl *pList = pSortData->pList;
int nSubItem = pSortData->nSubItem;
int nAsc = pSortData->nAsc;
//find item index
LVFINDINFO findInfo;
findInfo.flags = LVFI_PARAM;
findInfo.lParam = lParam1;
//1st index
int nPrevIndex = pList->FindItem(&findInfo, -1);
findInfo.lParam = lParam2;
//2nd index
int nNextIndex = pList->FindItem(&findInfo, -1);
//get item string
CString strPrev = pList->GetItemText(nPrevIndex, nSubItem);
CString strNext = pList->GetItemText(nNextIndex, nSubItem);
//if (nSubItem == 2)
//{
// int prev = _ttol(strPrev);
// int next = _ttol(strNext);
// if (prev > next)
// return nAsc;
// else
// return -nAsc;
//}
return wcscmp(strPrev, strNext) * nAsc;
}
下一篇我来说说如果不用SetItemDate如何来实现点击表头排序 CList 点击表头排序 (3)两种排序的第二种
CList 点击表头排序 (2)两种排序方法中其中一种的更多相关文章
- CList 点击表头排序 (3)两种排序的第二种
在头两篇中介绍了CListCtrl::SortItems() 方法的使用和其中的一个排序方法,这篇介绍另一种方法 CList 点击表头排序 (1)SortItems函数 CList 点击表头排序 (2 ...
- CList 点击表头排序 (1)SortItems函数
点击表头排序整体的思路都是去 CListCtrl类中的方法SortItems去实现 CListCtrl::SortItems的原型是: BOOL SortItems( PFNLVCOMPARE pfn ...
- JAVA文件的两种读取方法和三种写入方法
在使用java对文件进行读写操作时,有多种方法可以使用,但不同的方法有不同的性能. 此文对常用的读写方法进行了整理,以备不时之需. 1.文件的读取 主要介绍两种常用的读取方法.按行读取和按字符块读取. ...
- Qt中事件处理的方法(三种处理方法,四种覆盖event函数,notify函数,event过滤,事件处理器。然后继续传递给父窗口。可观察QWidget::event的源码,它是虚拟保护函数,可改写)
一.Qt中事件处理的方式 1.事件处理模式一 首先是事件源产生事件,最后是事件处理器对这些事件进行处理.然而也许大家会问, Qt中有这么多类的事件,我们怎么样比较简便的处理每个事件呢?设想,如果是 ...
- 非常强大的table根据表头排序,点击表头名称,对其内容排序
js代码: /** * 通过表头对表列进行排序 * * @param sTableID * 要处理的表ID<table id=''> * @param iCol * 字段列id eg: 0 ...
- EasyUI Datagrid 分页的情况下实现点击表头的小三角图标对数据库中所有数据重新排序
说明一下: 当点击 datagrid 表头某一列的小三角图标时,easyui 本身是有排序的,但是在当我们对 datagrid 进行了分页的情况下,点击排序只是对当前页的数据进行排序,而需求需要我对数 ...
- android studio gradle 两种更新方法更新
android studio gradle 两种更新方法更新 第一种.Android studio更新 第一步:在你所在项目文件夹下:你项目根目录gradlewrappergradle-wrapper ...
- Linux系统中存储设备的两种表示方法
转:https://blog.csdn.net/holybin/article/details/38637381 一.对于IDE接口的硬盘的两种表示方法: 1.IDE接口硬盘,对于整块硬盘的两种表示方 ...
- iOS中 三种随机数方法详解
ios 有如下三种随机数方法: //第一种 srand((unsigned)time(0)); //不加这句每次产生的随机数不变 int i = rand() % 5; //第二种 srandom(t ...
随机推荐
- thinkphp5项目--企业单车网站(六)
thinkphp5项目--企业单车网站(六) 项目地址 fry404006308/BicycleEnterpriseWebsite: Bicycle Enterprise Websitehttps:/ ...
- Material Design控件使用学习 TabLayout+SwipeRefreshlayout
效果: Tablayout有点类似之前接触过的开源ViewPagerIndicator,将其与viewpager绑定,可实现viewpager的导航功能. SwipeRefreshLayout是官方出 ...
- SQL调用Webservices
IF NOT object_id('proc_CallWebServices') IS NULL DROP PROCEDURE proc_CallWebServices GO CREATE PROCE ...
- SQL函数-stuff()
select stuff(列名,开始位置,长度,替代字符串) 用于删除指定长度的字符串,并可以在指定长度的地方插入新的字符: 在指定长度的地方添加新的字符
- su su- sudo区别概述
在Linux的操作中经常会用到su 命令进行用户的切换和sudo命令获取root权限,su su- sudo三个命令经常弄混,下面简单的讲解下. 一.查看su的命令帮助信息: pipci@openSU ...
- 【Docker端口映射】
Docker端口映射即将容器内开放的端口映射到宿主机端口,以实现外部网络的访问. 首先,我们先下载用于测试端口映射的镜像: [root@fedora ~]# docker pull training/ ...
- blkid---对系统块设备信息查询
在Linux下可以使用blkid命令对查询设备上所采用文件系统类型进行查询.blkid主要用来对系统的块设备(包括交换分区)所使用的文件系统类型.LABEL.UUID等信息进行查询.要使用这个命令必须 ...
- 测试理论--web测试方法总结
一.输入框 1.字符型输入框: (1)字符型输入框:英文全角.英文半角.数字.空或者空格.特殊字符“~!@#¥%……&*?[]{}”特别要注意单引号和&符号.禁止直接输入特殊字符时,使 ...
- NStimer 被堵塞
我们在界面上滚动一个scrollview,那么我们会发如今停止滚动前,会发现NSTimer未被运行.就好像scrollView在滚动的时候将timer暂停了一样,在查看对应文档后发现,这事实上就是ru ...
- LightOJ 1070 Algebraic Problem (推导+矩阵高速幂)
题目链接:problem=1070">LightOJ 1070 Algebraic Problem 题意:已知a+b和ab的值求a^n+b^n.结果模2^64. 思路: 1.找递推式 ...