MFC实现点击列表头进行排序
MFC实现点击列表头排序
1、添加消息处理函数
在列表窗口右键,类向导。选择 IDC_LIST1(我的列表控件的ID),消息选择LVN_COLUMNCLICK。

2、消息映射如下

然后会在 cpp 文件中生成以下函数
void CFLashSearchDlg::OnLvnColumnclickFlashConfigList(NMHDR *pNMHDR, LRESULT *pResult)
{LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);*pResult = 0;
}
3、定义两个全局变量用于存储参数,一个全局静态函数用作比较回调
// 在对应的 cpp 文件中定义
DWORD dwSelColID = 0; // 选择的列
bool bASC = FALSE; // 是否升序
static int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort); // 点击列表头进行升/降排序的比较函数
4、具体实现消息处理函数
// 点击列表头进行升序或降序排序
void CFLashSearchDlg::OnLvnColumnclickFlashConfigList(NMHDR *pNMHDR, LRESULT *pResult)
{LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);// TODO: 在此添加控件通知处理程序代码if(dwSelColID != pNMLV->iSubItem){dwSelColID = pNMLV->iSubItem;bASC = bASC;}elsebASC = !bASC;int count = m_flashConfigList.GetItemCount();for(int i = 0; i < count; ++i)m_flashConfigList.SetItemData(i, i);m_flashConfigList.SortItems(&CompareFunc, (LPARAM)(&m_flashConfigList));*pResult = 0;
}
这段代码是一个消息处理函数,处理了列表控件的列点击消息 LVN_COLUMNCLICK。
-
首先,通过
reinterpret_cast将传递给消息处理函数的NMHDR结构体指针转换为LPNMLISTVIEW类型,这是因为列表控件的列点击消息LVN_COLUMNCLICK使用的是NMLISTVIEW结构体。 -
接着,根据列点击的子项索引
pNMLV->iSubItem和之前保存的当前列索引dwSelColID进行比较。如果当前列索引与点击的子项索引不同,则更新当前列索引为点击的子项索引,并保持排序顺序不变(bASC = bASC)。如果当前列索引与点击的子项索引相同,则切换排序顺序(bASC = !bASC)。 -
然后,获取列表控件中项的总数,并为每个项设置与其相同的数据,这样在排序后可以保持项的数据与列表控件中的位置对应。
-
最后,调用列表控件的
SortItems函数对列表进行排序。作为参数传递给SortItems函数的是静态成员函数CompareFunc的地址,以及一个参数,即列表控件本身的地址。CompareFunc函数会根据列点击的子项索引和排序顺序来进行排序。 -
将
pResult设置为 0,表示消息处理已经完成。
总的来说,这段代码的作用是在列表控件的列点击事件发生时,根据点击的列索引以及当前的排序顺序对列表项进行排序。
5、添加回调函数
// 按列表头升序或逆序比较函数
static int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{CListCtrl* pListCtrl = (CListCtrl*)lParamSort;LVFINDINFO findInfo;findInfo.flags = LVFI_PARAM;findInfo.lParam = lParam1;int iItem1 = pListCtrl->FindItem(&findInfo, -1);findInfo.lParam = lParam2;int iItem2 = pListCtrl->FindItem(&findInfo, -1);CString strItem1 = pListCtrl->GetItemText(iItem1, dwSelColID);CString strItem2 = pListCtrl->GetItemText(iItem2, dwSelColID);if (bASC)return strItem1.Compare(strItem2);elsereturn strItem2.Compare(strItem1);
}
这段代码是用于比较两个列表项的函数,用于在排序时确定它们的顺序。
-
static int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort): 这是一个静态成员函数,用于比较两个列表项的回调函数。它接受三个参数:lParam1: 第一个列表项的自定义数据,通常是列表项的索引或其他标识符。lParam2: 第二个列表项的自定义数据,同样是列表项的索引或其他标识符。lParamSort: 对列表控件的指针,用于访问列表控件以获取列表项的文本。
-
CListCtrl* pListCtrl = (CListCtrl*)lParamSort;: 将lParamSort转换为CListCtrl*类型的指针,以便在比较函数中访问列表控件。 -
LVFINDINFO findInfo; findInfo.flags = LVFI_PARAM; findInfo.lParam = lParam1; int iItem1 = pListCtrl->FindItem(&findInfo, -1);: 使用lParam1和lParam2查找它们对应的列表项索引。这是通过设置LVFINDINFO结构体中的lParam字段来进行的,然后调用FindItem函数来查找列表中第一个匹配项的索引。 -
CString strItem1 = pListCtrl->GetItemText(iItem1, dwSelColID);: 使用列表控件指针和列表项索引获取第一个列表项的文本。dwSelColID是当前选择的列的索引。 -
同样的步骤也适用于第二个列表项,只是使用了
lParam2来查找索引,并获取其文本。
: 使用列表控件指针和列表项索引获取第一个列表项的文本。dwSelColID 是当前选择的列的索引。
-
同样的步骤也适用于第二个列表项,只是使用了
lParam2来查找索引,并获取其文本。 -
if (bASC) return strItem1.Compare(strItem2); else return strItem2.Compare(strItem1);: 根据当前排序顺序决定返回哪个字符串比较结果。如果是升序排序,则直接返回两个字符串的比较结果;如果是降序排序,则将两个字符串的比较结果反转再返回。
相关文章:
MFC实现点击列表头进行排序
MFC实现点击列表头排序 1、添加消息处理函数 在列表窗口右键,类向导。选择 IDC_LIST1(我的列表控件的ID),消息选择LVN_COLUMNCLICK。 2、消息映射如下 然后会在 cpp 文件中生成以下函数 void CFLashSearchDlg::OnLvnColumnclic…...
用龙梦迷你电脑福珑2.0做web服务器
用龙梦迷你电脑福珑2.0上做web服务器是可行的。已将一个网站源码放到该电脑,在局域网里可以访问网站网页。另外通过在同一局域网内的一台windows10电脑上安装花生壳软件,也可以在外网访问该内网服务器网站网页。该电脑的操作系统属于LAMP。在该电脑上安装…...
秋招后端开发面试题 - JVM类加载机制
目录 JVM类加载机制前言面试题能说一下类的生命周期吗?类加载的过程知道吗?类加载器有哪些?什么是双亲委派机制?为什么要用双亲委派机制?如何破坏双亲委派机制?如何判断一个类是无用的类? JVM类…...
OceanBase 分布式数据库【信创/国产化】- OceanBase 配置项和系统变量概述
本心、输入输出、结果 文章目录 OceanBase 分布式数据库【信创/国产化】- OceanBase 配置项和系统变量概述前言OceanBase 数据更新架构OceanBase 配置项和系统变量概述配置项配置项分类配置项查询系统变量系统变量分类系统变量查询配置项与系统变量的区分OceanBase 分布式数据库…...
单单单单单の刁队列
在数据结构的学习中,队列是一种常用的线性数据结构,它遵循先进先出(FIFO)的原则。而单调队列是队列的一种变体,它在特定条件下保证了队列中的元素具有某种单调性质,例如单调递增或单调递减。单调队列在处理…...
电脑windows系统压缩解压软件-Bandizip
一、软件功能 Bandizip是一款功能强大的压缩和解压缩软件,具有快速拖放、高速压缩、多核心支持以及广泛的文件格式支持等特点。 Bandizip软件的功能主要包括: 1. 支持多种文件格式 Bandizip可以处理多种压缩文件格式,包括ZIP, 7Z, RAR, A…...
图片公式识别@文档公式识别@表格识别@在线和离线OCR工具
文章目录 abstract普通文字识别本地软件识别公式扩展插件下载小结 在线识别网站/API👺Quicker整合(推荐)可视化编辑和识别公式其他多模态大模型识别图片中的公式排版 开源模型 abstract 本文介绍免费图片文本识别(OCR)工具,包括普通文字识别,公式识别,甚至是手写公…...
Java高阶私房菜:JVM分代收集算法介绍和各垃圾收集器原理分解
目录 什么是分代收集算法 GC的分类和专业术语 什么是垃圾收集器 垃圾收集器的分类及组合 编辑 应关注的核心指标 Serial和ParNew收集器原理 Serial收集器 ParNew收集器 Parallel和CMS收集器原理 Parallel 收集器 CMS收集器 新一代垃圾收集器G1和ZGC G1垃圾收集器…...
为什么IB损失要在100epochs后再用?
在给定的代码中,参数start_ib_epoch用于控制从第几轮开始使用IB(Instance-Balanced)损失函数进行训练。具体来说,如果start_ib_epoch的值大于等于100,那么在训练的前100轮中将使用普通的交叉熵损失函数(CE&…...
《Video Mamba Suite》论文笔记(4)Mamba在时空建模中的作用
原文翻译 4.4 Mamba for Spatial-Temporal Modeling Tasks and datasets.最后,我们评估了 Mamba 的时空建模能力。与之前的小节类似,我们在 Epic-Kitchens-100 数据集 [13] 上评估模型在zero-shot多实例检索中的性能。 Baseline and competitor.ViViT…...
【备战软考(嵌入式系统设计师)】10 - 软件工程基础
这一部分的内容是概念比较多,不要理解,去感受。 涉及的知识点是嵌入式系统开发和维护的部分,也就是和管理相关的,而不是具体如何进行嵌入式系统开发的细节。 系统开发生命周期 按照顺序有下面几个阶段,我们主要要记…...
随手笔记-GNN(朴素图神经网络)
自己看代码随手写的一点备忘录,自己看的,不喜勿喷 GNN (《------ 代码) 刚开始我还在怀疑为什么没有加weigth bias,已经为什么权重才两个,原来是对node_feats进行的network的传播,而且自己内部直接进行了。 下面是一…...
C 语言指针怎么理解?
在今天的学习中,我注意到有位学员似乎对 C 语言指针的理解有些困惑。为了帮助大家更好地理解,我来举个例子。 C 语言指针就好比 Windows 桌面上常见的快捷方式。快捷方式可以指向某个游戏,这就是普通指针;它也可以指向另一个快捷…...
HTTP协议:通信机制、特点及实践应用
目录 前言 1. 运行机制 2. 通信方式 3. 主要特点 4. 统一资源标识符(URL) 5. HTTP报文 6. HTTP请求 7. HTTP响应 8. 实体 9. 持续连接 结语 前言 HTTP(Hypertext Transfer Protocol)是互联网上应用最广泛的一种协议&a…...
Leetcode—289. 生命游戏【中等】
2024每日刷题(126) Leetcode—289. 生命游戏 算法思想 实现代码 class Solution { public:void gameOfLife(vector<vector<int>>& board) {int rows board.size();int cols board[0].size();int neighbors[3] {0, 1, -1};vector<…...
系统运维(虚拟化)
1.VLAN VLAN(Virtual Local Area Network)即虚拟局域网,是将一个物理的LAN在逻辑上划分成多个广播域的通信技术。 每个VLAN是一个广播域,VLAN内的主机间可以直接通信,而VLAN间则不能直接互通。这样,广播报…...
Linux域名解析
1.hosts:windows c盘下面 Linux: /etc/hosts 作用:实现名字解析,主要为本地主机名、集群节点提供快速解析。平面式结构,集中式数据库。 缺点:不便于查询更新 2.DNS:域名系统 作用:实现名字解析(分层性,层次性) FQDN:完全合格域名/全称域…...
树形结构和列表的区别
树形结构和列表在数据组织、表示方式以及应用场景等方面存在明显的区别。 首先,树形结构是一种非线性的数据结构,表现为层次的嵌套结构。每个节点可以有多个子节点,这些子节点又可以有自己的子节点,形成一个层次分明的结构。这种一…...
Go中json的解析和反解析
在解析过程中,反向解析不包含其中的部分参数也不会报错,这是需要注意的一点 31 func main() { // E: main redeclared in this block 32 type A…...
SpringBoot+vue实现退出功能
目录 1. 创建点击事件 2. 编写退出逻辑 在Spring Boot 和 Vue.js 应用中实现退出功能,通常涉及到前端的用户界面操作和注销逻辑。 以下是实现退出功能的步骤: 1. 创建点击事件 在header.vue中创建一个点击事件 <span style"text-decoratio…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...
vscode里如何用git
打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...
【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...
学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...
sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...
算法岗面试经验分享-大模型篇
文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer (1)资源 论文&a…...
R 语言科研绘图第 55 期 --- 网络图-聚类
在发表科研论文的过程中,科研绘图是必不可少的,一张好看的图形会是文章很大的加分项。 为了便于使用,本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中,获取方式: R 语言科研绘图模板 --- sciRplothttps://mp.…...
Leetcode33( 搜索旋转排序数组)
题目表述 整数数组 nums 按升序排列,数组中的值 互不相同 。 在传递给函数之前,nums 在预先未知的某个下标 k(0 < k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...
spring Security对RBAC及其ABAC的支持使用
RBAC (基于角色的访问控制) RBAC (Role-Based Access Control) 是 Spring Security 中最常用的权限模型,它将权限分配给角色,再将角色分配给用户。 RBAC 核心实现 1. 数据库设计 users roles permissions ------- ------…...
