当前位置: 首页 > news >正文

MFC实现点击列表头进行排序

MFC实现点击列表头排序

1、添加消息处理函数

在列表窗口右键,类向导。选择 IDC_LIST1(我的列表控件的ID),消息选择LVN_COLUMNCLICK。

image

2、消息映射如下

image

然后会在 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

  1. 首先,通过 reinterpret_cast 将传递给消息处理函数的 NMHDR 结构体指针转换为 LPNMLISTVIEW 类型,这是因为列表控件的列点击消息 LVN_COLUMNCLICK 使用的是 NMLISTVIEW 结构体。

  2. 接着,根据列点击的子项索引 pNMLV->iSubItem 和之前保存的当前列索引 dwSelColID 进行比较。如果当前列索引与点击的子项索引不同,则更新当前列索引为点击的子项索引,并保持排序顺序不变(bASC = bASC)。如果当前列索引与点击的子项索引相同,则切换排序顺序(bASC = !bASC)。

  3. 然后,获取列表控件中项的总数,并为每个项设置与其相同的数据,这样在排序后可以保持项的数据与列表控件中的位置对应。

  4. 最后,调用列表控件的 SortItems 函数对列表进行排序。作为参数传递给 SortItems 函数的是静态成员函数 CompareFunc 的地址,以及一个参数,即列表控件本身的地址。CompareFunc 函数会根据列点击的子项索引和排序顺序来进行排序。

  5. 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);
}

这段代码是用于比较两个列表项的函数,用于在排序时确定它们的顺序。

  1. static int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort): 这是一个静态成员函数,用于比较两个列表项的回调函数。它接受三个参数:

    • lParam1: 第一个列表项的自定义数据,通常是列表项的索引或其他标识符。
    • lParam2: 第二个列表项的自定义数据,同样是列表项的索引或其他标识符。
    • lParamSort: 对列表控件的指针,用于访问列表控件以获取列表项的文本。
  2. CListCtrl* pListCtrl = (CListCtrl*)lParamSort;: 将 lParamSort 转换为 CListCtrl* 类型的指针,以便在比较函数中访问列表控件。

  3. LVFINDINFO findInfo; findInfo.flags = LVFI_PARAM; findInfo.lParam = lParam1; int iItem1 = pListCtrl->FindItem(&findInfo, -1);: 使用 lParam1lParam2 查找它们对应的列表项索引。这是通过设置 LVFINDINFO 结构体中的 lParam 字段来进行的,然后调用 FindItem 函数来查找列表中第一个匹配项的索引。

  4. CString strItem1 = pListCtrl->GetItemText(iItem1, dwSelColID);: 使用列表控件指针和列表项索引获取第一个列表项的文本。dwSelColID 是当前选择的列的索引。

  5. 同样的步骤也适用于第二个列表项,只是使用了 lParam2 来查找索引,并获取其文本。

: 使用列表控件指针和列表项索引获取第一个列表项的文本。dwSelColID 是当前选择的列的索引。

  1. 同样的步骤也适用于第二个列表项,只是使用了 lParam2 来查找索引,并获取其文本。

  2. if (bASC) return strItem1.Compare(strItem2); else return strItem2.Compare(strItem1);: 根据当前排序顺序决定返回哪个字符串比较结果。如果是升序排序,则直接返回两个字符串的比较结果;如果是降序排序,则将两个字符串的比较结果反转再返回。

相关文章:

MFC实现点击列表头进行排序

MFC实现点击列表头排序 1、添加消息处理函数 在列表窗口右键&#xff0c;类向导。选择 IDC_LIST1&#xff08;我的列表控件的ID&#xff09;&#xff0c;消息选择LVN_COLUMNCLICK。 2、消息映射如下 然后会在 cpp 文件中生成以下函数 void CFLashSearchDlg::OnLvnColumnclic…...

用龙梦迷你电脑福珑2.0做web服务器

用龙梦迷你电脑福珑2.0上做web服务器是可行的。已将一个网站源码放到该电脑&#xff0c;在局域网里可以访问网站网页。另外通过在同一局域网内的一台windows10电脑上安装花生壳软件&#xff0c;也可以在外网访问该内网服务器网站网页。该电脑的操作系统属于LAMP。在该电脑上安装…...

秋招后端开发面试题 - JVM类加载机制

目录 JVM类加载机制前言面试题能说一下类的生命周期吗&#xff1f;类加载的过程知道吗&#xff1f;类加载器有哪些&#xff1f;什么是双亲委派机制&#xff1f;为什么要用双亲委派机制&#xff1f;如何破坏双亲委派机制&#xff1f;如何判断一个类是无用的类&#xff1f; JVM类…...

OceanBase 分布式数据库【信创/国产化】- OceanBase 配置项和系统变量概述

本心、输入输出、结果 文章目录 OceanBase 分布式数据库【信创/国产化】- OceanBase 配置项和系统变量概述前言OceanBase 数据更新架构OceanBase 配置项和系统变量概述配置项配置项分类配置项查询系统变量系统变量分类系统变量查询配置项与系统变量的区分OceanBase 分布式数据库…...

单单单单单の刁队列

在数据结构的学习中&#xff0c;队列是一种常用的线性数据结构&#xff0c;它遵循先进先出&#xff08;FIFO&#xff09;的原则。而单调队列是队列的一种变体&#xff0c;它在特定条件下保证了队列中的元素具有某种单调性质&#xff0c;例如单调递增或单调递减。单调队列在处理…...

电脑windows系统压缩解压软件-Bandizip

一、软件功能 Bandizip是一款功能强大的压缩和解压缩软件&#xff0c;具有快速拖放、高速压缩、多核心支持以及广泛的文件格式支持等特点。 Bandizip软件的功能主要包括&#xff1a; 1. 支持多种文件格式 Bandizip可以处理多种压缩文件格式&#xff0c;包括ZIP, 7Z, RAR, A…...

图片公式识别@文档公式识别@表格识别@在线和离线OCR工具

文章目录 abstract普通文字识别本地软件识别公式扩展插件下载小结 在线识别网站/API&#x1f47a;Quicker整合(推荐)可视化编辑和识别公式其他多模态大模型识别图片中的公式排版 开源模型 abstract 本文介绍免费图片文本识别(OCR)工具,包括普通文字识别,公式识别,甚至是手写公…...

Java高阶私房菜:JVM分代收集算法介绍和各垃圾收集器原理分解

目录 什么是分代收集算法 GC的分类和专业术语 什么是垃圾收集器 垃圾收集器的分类及组合 ​编辑 应关注的核心指标 Serial和ParNew收集器原理 Serial收集器 ParNew收集器 Parallel和CMS收集器原理 Parallel 收集器 CMS收集器 新一代垃圾收集器G1和ZGC G1垃圾收集器…...

为什么IB损失要在100epochs后再用?

在给定的代码中&#xff0c;参数start_ib_epoch用于控制从第几轮开始使用IB&#xff08;Instance-Balanced&#xff09;损失函数进行训练。具体来说&#xff0c;如果start_ib_epoch的值大于等于100&#xff0c;那么在训练的前100轮中将使用普通的交叉熵损失函数&#xff08;CE&…...

《Video Mamba Suite》论文笔记(4)Mamba在时空建模中的作用

原文翻译 4.4 Mamba for Spatial-Temporal Modeling Tasks and datasets.最后&#xff0c;我们评估了 Mamba 的时空建模能力。与之前的小节类似&#xff0c;我们在 Epic-Kitchens-100 数据集 [13] 上评估模型在zero-shot多实例检索中的性能。 Baseline and competitor.ViViT…...

【备战软考(嵌入式系统设计师)】10 - 软件工程基础

这一部分的内容是概念比较多&#xff0c;不要理解&#xff0c;去感受。 涉及的知识点是嵌入式系统开发和维护的部分&#xff0c;也就是和管理相关的&#xff0c;而不是具体如何进行嵌入式系统开发的细节。 系统开发生命周期 按照顺序有下面几个阶段&#xff0c;我们主要要记…...

随手笔记-GNN(朴素图神经网络)

自己看代码随手写的一点备忘录&#xff0c;自己看的&#xff0c;不喜勿喷 GNN (《------ 代码) 刚开始我还在怀疑为什么没有加weigth bias&#xff0c;已经为什么权重才两个&#xff0c;原来是对node_feats进行的network的传播&#xff0c;而且自己内部直接进行了。 下面是一…...

C 语言指针怎么理解?

在今天的学习中&#xff0c;我注意到有位学员似乎对 C 语言指针的理解有些困惑。为了帮助大家更好地理解&#xff0c;我来举个例子。 C 语言指针就好比 Windows 桌面上常见的快捷方式。快捷方式可以指向某个游戏&#xff0c;这就是普通指针&#xff1b;它也可以指向另一个快捷…...

HTTP协议:通信机制、特点及实践应用

目录 前言 1. 运行机制 2. 通信方式 3. 主要特点 4. 统一资源标识符&#xff08;URL&#xff09; 5. HTTP报文 6. HTTP请求 7. HTTP响应 8. 实体 9. 持续连接 结语 前言 HTTP&#xff08;Hypertext Transfer Protocol&#xff09;是互联网上应用最广泛的一种协议&a…...

Leetcode—289. 生命游戏【中等】

2024每日刷题&#xff08;126&#xff09; 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&#xff08;Virtual Local Area Network&#xff09;即虚拟局域网&#xff0c;是将一个物理的LAN在逻辑上划分成多个广播域的通信技术。 每个VLAN是一个广播域&#xff0c;VLAN内的主机间可以直接通信&#xff0c;而VLAN间则不能直接互通。这样&#xff0c;广播报…...

Linux域名解析

1.hosts:windows c盘下面 Linux: /etc/hosts 作用:实现名字解析&#xff0c;主要为本地主机名、集群节点提供快速解析。平面式结构&#xff0c;集中式数据库。 缺点:不便于查询更新 2.DNS:域名系统 作用:实现名字解析(分层性&#xff0c;层次性) FQDN:完全合格域名/全称域…...

树形结构和列表的区别

树形结构和列表在数据组织、表示方式以及应用场景等方面存在明显的区别。 首先&#xff0c;树形结构是一种非线性的数据结构&#xff0c;表现为层次的嵌套结构。每个节点可以有多个子节点&#xff0c;这些子节点又可以有自己的子节点&#xff0c;形成一个层次分明的结构。这种一…...

Go中json的解析和反解析

在解析过程中&#xff0c;反向解析不包含其中的部分参数也不会报错&#xff0c;这是需要注意的一点 31 func main() { // E: main redeclared in this block 32 type A…...

SpringBoot+vue实现退出功能

目录 1. 创建点击事件 2. 编写退出逻辑 在Spring Boot 和 Vue.js 应用中实现退出功能&#xff0c;通常涉及到前端的用户界面操作和注销逻辑。 以下是实现退出功能的步骤&#xff1a; 1. 创建点击事件 在header.vue中创建一个点击事件 <span style"text-decoratio…...

Linux操作系统中管理磁盘的另外一种操作方式。即LVM——逻辑卷管理操作

在Linux操作系统中管理磁盘的一种方法名称——LVM&#xff0c;这种管理磁盘的优势。 1.使用LVM去管理磁盘可以在不影响原来数据的前提下去扩容磁盘空间或者是缩减磁盘空间。 在LVM中除了上层逻辑券可以扩容&#xff0c;下层的券组也可以扩容。 2.使用LVM管理的磁盘支持快照功…...

Lua 零基础入门

Lua 1.Lua是什么&#xff1f; 1.1 Lua的历史 Lua是由Roberto Ierusalimschy、Luiz Henrique de Figueiredo和Waldemar Celes于1993年创建的&#xff0c;当时他们是巴西里约热内卢天主教大学计算机图形技术组&#xff08;Tecgraf&#xff09;的成员。在开发Lua之前&#xff0…...

记录DemoApplication.java不变蓝问题

问题 解决方案 一、点击右下角加载 二、右键项目 勾选maven...

22_Scala集合Seq

文章目录 Seq序列1.构建集合2.List集合元素拼接&&集合拼接3.可变Seq&&List3.1 ListBuffer创建3.2 增删改查3.3 相互转化 Appendix1.Scala起别名2.Seq底层3.关于运算符操作: :4.空集合的表示 Seq序列 –Seq表示有序&#xff0c;数据可重复的集合 1.构建集合 …...

机器学习初学者 6 个核心算法!建议收藏,反复观看!

今天再来介绍机器学习算法的基本概念和适用场景&#xff01; 首先&#xff0c;引用一句英国统计学家George E. P. Box的名言&#xff1a;All models are wrong, but some are useful. 没有哪一种算法能够适用所有情况&#xff0c;只有针对某一种问题更有用的算法。 也就是说&…...

SpringBoot 打包所有依赖

SpringBoot 项目打包的时候可以通过插件 spring-boot-maven-plugin 来 repackage 项目&#xff0c;使得打的包中包含所有依赖&#xff0c;可以直接运行。例如&#xff1a; <plugins><plugin><groupId>org.springframework.boot</groupId><artifact…...

QpushButton绘制圆角矩形并绘制背景颜色

要在QPushButton的paintEvent中绘制按钮的颜色&#xff0c;可以创建一个自定义的QPushButton类&#xff0c;并重写它的paintEvent函数。在paintEvent函数中&#xff0c;可以使用QPainter来绘制按钮的背景颜色。 以下是一个简单的示例代码&#xff0c;演示如何在自定义的QPushB…...

Core Impact 21.5 (Windows) - 高级渗透测试

Core Impact 21.5 (Windows) - 高级渗透测试 Fortra | Core Security Penetration testing software, Release Feb 2024 请访问原文链接&#xff1a;Core Impact 21.5 (Windows) - 高级渗透测试&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&…...

【Web前端】定位_浮动_音视频

1、定位 1.1想对定位 相对定位&#xff0c;使用relative&#xff0c;参考点是标签之前的位置&#xff0c;不是相对于父节点、同级节点或浏览器。相对定位通过left、right进行水平偏移&#xff0c;通过top、bottom进行垂直偏移Ieft:表示相对于原本位置的左外边界右移的距离rig…...

【Osek网络管理测试】[TG4_TC3]LimpHome状态下的睡眠中断

🙋‍♂️ 【Osek网络管理测试】系列💁‍♂️点击跳转 文章目录 1.环境搭建2.测试目的3.测试步骤4.预期结果5.测试结果1.环境搭建 硬件:VN1630 软件:CANoe 2.测试目的 验证DUT在LimpHome状态下的睡眠中断是否正确 分析:在跛脚运行状态下,满足睡眠条件后,进入到NM…...

贵阳企业网站建设/网络销售好做吗

mybatis需要定位到执行哪条sql语句&#xff1a; 针对注解通过Mapper.java的全限定类名加方法名定位&#xff0c;例如&#xff1a; package com.xh.mapper; import com.xh.Admin; //接口方法必须与xml的id相同 xml代替注解作用 public interface AdminMapper {Select("se…...

电商网站建设与管理/北京seo收费

使用tc限制所有流量匹配tcp(协议6)目标端口54000(256Kbits入站)到eth0的所有流量的示例…作为根……tc qdisc add dev eth0 handle ffff: ingresstc filter add dev eth0 parent ffff: protocol ip prio 50 u32 \match ip protocol 6 0xff \match ip dport 54000 0xffff police…...

ps海报素材网/seo网站优化知识

写一个脚本/root/bin/yesorno.sh&#xff0c;提示用户输入yes或no,并判断用户输入的是yes还是no,或是其它信息#!/bin/bash read -p"put your answer(yes or no):" Answer case $Answer in y|Y|[yY][eE][sS]) //判断用户输入yes时的一切可能性echo &q…...

做网站毕业设计/微信推广软件哪个好

1、下载android源码2、在linux下生成android.ipr等执行下面的命令即可生成android.ipr等文件&#xff1a;cd &#xff5e;/aosp //具体的源码根目录source build/envsetup.sh //用于初始化环境变量mmm development/tools/idegen/ //生成文件out/host/linux-x86/framework/idege…...

wordpress快速发文插件/最新旅游热点

Vue通用信息录入界面&#xff0c;供大家参考&#xff0c;具体内容如下员工信息录入员工信息录入 姓名&#xff1a; 年龄&#xff1a; 性别&#xff1a; > 男女手机&#xff1a; 新增用户 序号姓名年龄性别手机操作{{index1}}{{student.name}}{{student.age}}{{student.sex}…...

腾讯企业邮箱浙江服务中心/专业做seo推广

1. Java NIO中的DatagramChannel是一个能收发UDP包的通道。因为UDP是无连接的网络协议&#xff0c;所以不能像其它通道那样读取和写入。它发送和接收的是数据包。 2. DatagramChannel的使用 &#xff08;1&#xff09;打开 DatagramChannel 下面是 DatagramChannel 的打开方式&…...