HDN_ENDTRACK

深入自定义CListCtrl重绘机制 本文还有配套的精品资源,点击获取 简介:在Windows编程中, CListCtrl 是一个常用于展示数据列表的控件。本文将详细介绍如何通过 OnNMCustomdraw 消息和自绘(Custom Draw)机制,自定义 CListCtrl 的外观,包括字体颜色、大小、背景颜色,甚至图片的加载。首先解释 OnNMCustom... 阅读详情
近期把List Control扩展成Grid,参考了两篇关于SubItem Selection的文章,一篇来自 Piotr Szewczyk.. 采用NM_CUSTOMDRAW方法,另一篇来自 Muhammad Azam. ,采用LVS_OWNERDRAWFIXED。我个人偏好于NM_CUSTOMDRAW,因为NM_CUSTOMDRAW可以控制是否自绘,可以控制自绘区域(CDDS_ITEMPREPAINT和CDDS_SUBITEM),详细内容请参阅 Neat Stuff to do in List Controls Using Custom Draw 。
      但两篇文章都存在一个问题: DrawText 时总是用 DT_LEFT ,因为我为每个 Column 都设了 Alignment ,结果是每列都是 Align Left 。于是我用作了修改, DrawText 时分别对应每个 Column 的 Alignment ,但是问题又出现了。
      我用NM_CUSTOMDRAW方法,当移动Column Header时,如果该列的Alignment为Center或Right时,该列的内容就出现“花屏”现象,原因是作者为了防止闪烁,采用以下方法:
 
void CMyList::InvalidateCell(int nRow, int nCol)
{
       //I add this function to reduce flickering
    CRect rc;
    if(nCol==0)
        GetItemRect(nRow,&rc,LVIR_LABEL);
    else
        GetSubItemRect(nRow,nCol,LVIR_BOUNDS,rc);
    InvalidateRect(&rc);
}     
程序中保存两个变量m_nRow,m_nCol,当变量的值改变了就会调用InvalidateCell(int nRow, int nCol)。而当我拖动Column Header时不会调用InvalidateCell(int nRow, int nCol)。
解决方法当然是捕获拖动Column Header时的消息,查看了相关资料,相关的消息是HDN_ITEMCHANGED:拖动过程中不断收到
HDN_BEGINTRACK:拖到开始时
EDN_ENDTRACK:拖动结束时
       那些消息是从CHeaderCtrl反馈回来的。(注:CHeaderCtrl有两种获得方法:一种是CListCtrl::GetHeaderCtrl(),一种是CListCtrl::GetDlgItem(0)。)
       我的CMyList是继承自CListCtrl,不论我怎样设定风格,如CMyList->GetHeaderCtrl()->ModifyStyle(0, HDS_HOTTRACK),还是捕获不了HDN_ITEMCHANGED,其它消息也捕不了。
       最后的办法只有设计一个类CMyHeaderCtrl继承自CHeaderCtrl,然后在CMyList的SubclassHeaderControl加入以下代码:
       CHeaderCtrl* pHeader = GetHeaderCtrl();
       if (pHeader)
       {
              VERIFY(m_HeaderCtrl.SubclassWindow(pHeader->m_hWnd));
       }
       因为ClassView中没有HDN_ITEMCHANGED所以要自己加
       ON_NOTIFY_REFLECT(HDN_ITEMCHANGED, OnItemChanged)
 
以下是OnItemChanged的实现
void CMyHeaderCtrl::OnItemChanged(NMHDR * pNMHDR, LRESULT* pResult)
{
       *pResult = 0;
 
       CMyList* pzList = static_cast<CMyList*>(GetParent());
       ASSERT(pzList);
 
       NMHEADER *pHdr = (NMHEADER*)pNMHDR;
 
       int nCol;//The changed column
       int topRow,bottomRow;//The visit top row and bottom row
 
       nCol = pHdr->iItem;
 
       if( pzList->Cols[nCol].getTextAlignFixed() == AlignLeft)
              return;//因为AlignLeft不存在“花屏”现象
 
       if( 0 == pzList->GetItemCount())
              return;
 
       topRow = pzList->GetTopIndex();
       bottomRow = pzList->GetCountPerPage();
 
       CRect rc1,rc2;
 
       pzList->GetSubItemRect(topRow,nCol,LVIR_BOUNDS,rc1);
       pzList->GetSubItemRect(bottomRow,nCol,LVIR_BOUNDS,rc2);
 
       if( 0 == nCol)
       {
              rc1.left = 0;
              rc2.left = 0;
              rc1.right = pzList->GetColumnWidth(0);
              rc2.right = rc1.right;
       }
       rc1.bottom = rc2.bottom;
 
       pzList->InvalidateRect(&rc1);
       TRACE("ItemChanged/n");
}
       至此,虽然问题已解决,重画区域已减到最小,但也存在小小的闪烁,但比Invalidate好多了。
       一些问题也是想不通:
1.  为什么继承的CListCtrl不能收到CHeaderCtrl的Trace消息?
2.  的Column为什么不会出现“花屏”现象?AlignLeft
 
今天收获很大,虽然最后也要动用到继承CHeaderCtrl,但也不失为好事,因为迟早也要继承CHeaderCtrl才能完成一些功能的,如禁止改变列宽,在列上画排序箭头。
ComfyUI全自动换装工作流:从零到一的实战指南 本文提供了一份详细的ComfyUI全自动换装工作流实战指南。从环境配置、模型准备到核心工作流架构的逐步拆解,手把手教你搭建一条高效的AI换装流水线。文章深入解析了从输入、预处理、融合到输出的四步核心逻辑,并分享了关键参数调优与进阶技巧,旨在帮助电商从业者、内容创作者及AI爱好者轻松实现高质量、高效率的“一键换装”。 阅读详情

相关推荐

【electron】- 从零到一:在electron-vite项目中集成better-sqlite3的工程化实践

本文详细介绍了在electron-vite项目中集成better-sqlite3数据库的完整工程化实践。针对原生模块的编译挑战,提供了从环境配置、路径规划、服务封装到IPC通信的解决方案,并重点解决了开发与生产环境的数据库路径分离及打包部署等核心问题,帮助开发者构建稳定高效的Electron桌面应用数据层。

weixin_29306571的博客 205

SubItem Selection in List Control改进版

近期把List Control扩展成Grid,参考了两篇关于SubItem Selection的文章,一篇来自Piotr Szewczyk.. 采用NM_CUSTOMDRAW方法,另一篇来自Muhammad Azam.,采用LVS_OWNERDRAWFIXED。我个人偏好于NM_CUSTOMDRAW,因为NM_CUSTOMDRAW可以控制是否自绘,可以控制自绘区域(CDDS_ITEMPREPAIN

SpriteLW的专栏 2688

华为无线WiFi实战:基于802.1x与NPS的企业级认证部署指南

本文提供了一份详尽的华为无线WiFi企业级认证部署实战指南。通过整合802.1x协议与Windows NPS服务器,构建基于AD域账号的安全认证体系,彻底解决传统WiFi密码共享带来的安全风险。文章详细拆解了从NPS服务器配置、证书部署到华为AC端RADIUS模板、AAA方案、认证域及VAP模板调用的全流程,并附有终端连接测试与常见故障排查方法,助力企业实现高效、安全的无线网络接入管理。

weixin_29239661的博客 271

MFC控件的使用方法(十四、列表控件(List Control))

十四、列表控件(List Control) 作用: 以列表的形式显示一组信息,显示每个包含图标(列表视图中)和标签的收集。除图标和标签外,每一项还能有显示在图标和标签的右边的列中的信息。 消息映射函数: LVN_DELETEALLITEM :删除视图中所有的项 LVN_COLUMNCLICK : 单击了其中的一列 HDN_ENDTRACK : 指示用户已经完成对视图中的标题分隔符的拖动。 HDN_ITEMCLICK : 指示用户单击来了标题中的某一项 HDN_ITEMKEYDOWN :通知标头控件的父窗口

qq_43812868的博客 3990

第十一届全国大学生GIS应用技能大赛——广西区域发展布局示意图

我们需要制作一幅广西区域发展布局示意图,最终成图参考“数据”文件夹中的广西区域发展布局示意图.png。地图使用的投影坐标系是 Asia_North_Albers_Equal_Area_Conic,其中地理坐标系是China_Geodetic_Coordinate_System_2000,中央经线东经 105°,标准纬线是北纬 25°和北纬 47°,出图比例尺 1:4,780,000。

@HNUSTer的博客 7800

在 SAP Gateway 主机上把 SAML 2.0 配置为 Service Provider:从架构到落地的完整实战

本文详细介绍了在SAP Gateway主机上配置SAML 2.0作为Service Provider的全流程。从概念梳理到实际操作,涵盖了关键步骤:启用本地SP服务、通过反向代理导出元数据、在IdP侧完成对接、配置信任关系与Artifact绑定、设置NameID身份联合等核心环节。特别强调了HTTP Artifact绑定的背道通信机制和证书配置要点,并针对常见错误提供了排障指引。文章注重实操性,结合SAP官方文档与社区最佳实践,为运维团队提供了一套完整的SAML SSO实施框架。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 150

控件的WM_NOTIFY消息映射

控件的WM_NOTIFY消息映射前几天,我尝试在CListCtrl中映射HDN_BEGINTRACK这个WM_NOTIFY消息。轻松的用ClassWizard建立了消息映射,几秒中完成了所有工作之后发生的事情却让我很长时间轻松不起来了。消息根本映射不上!!BEGIN_MESSAGE_MAP(CPrevList, CListCtrl) //{{AFX_MSG_MAP(CPrevLis

小发猫 2318

2025年开源气象大模型的实现原理与实践指南

气象大模型在人工智能时代实现了革命性突破,通过深度学习技术以更低的计算成本达到甚至超越传统数值天气预报的精度。开源气象大模型的出现使得全球研究者和机构都能参与气象AI的创新。本文详细解析了开源气象大模型的实现原理,包括核心架构、数据准备、训练方法和实际预测流程,并提供了实践指南。核心架构主要采用Transformer、图神经网络和扩散模型,处理多模态数据融合和时空联合建模。数据体系构建涉及数据来源、预处理和增强策略。模型训练关键技术包括损失函数设计、分布式训练优化和训练过程监控。微调与领域适应策略包括迁移学

专注AI大模型,软件混淆,授权 1182

完美自绘制CListCtrl控件[MFC]

自绘一个item我相信大部分人都在10分钟内能搞定 但是绘制非item部分的区域,同学们就傻眼了,不知道如何下手 CListCtrl的绘制机制在windows里做了一个优化,就是一个绘制循环通知过程 之所以不在OnPaint中画是考虑效率上的原因,好了我们看下这个绘制循环:     CDDS_PREERASE 准备开始擦除循环  CDDS_POSTERAS

wjj715211的专栏 1640

【微电网优化】基于粒子群求解CHP机组、气网、电网、储热罐和电锅炉微电网优化模型附matlab代码

1 简介 我国风力发电近年发展迅速,装机容量已成为全球首位.随着风力发电在电力系统中的渗透率不断提高,我国多个地区(尤其是"三北"地区)已经面临着十分严峻的风电消纳问题,产生不容忽视的弃风问题.针对目前我国风电消纳存在的困难,本文提出粒子群优化CHP机组、气网、电网、储热罐和电锅炉微电网控制策略. 2 部分代码 Ppv=[0;0;0;0;0;0;9.86000000000000;19.0100000000000;33.1000000000000;45.0700000000000;64.7900000

qq_59747472的博客 672

【数据集】全球大气空气柱平均甲烷(XCH₄)和一氧化碳(XCO)浓度数据集 TROPOMI/WFMD

全球大气空气柱平均甲烷(XCH₄)和一氧化碳(XCO)浓度数据集 TROPOMI/WFMD

WW、forever的博客 389

关于MFC中CListCtrl控件调整列宽的消息的问题

在MFC中CListCtrl列表控件中,在鼠标拖动调整列宽时的几个消息中,HDN_ENDTRACK和HDN_ITEMCHANGING的响应函数GetColumn获取到的列宽信息均是列宽更改前的值,无法获取鼠标左键松开后的列宽值,可以使用HDN_ITEMCHANGED获取更改值。 ...

weixin_44021514的博客 921

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

HDN_TRACK and HDS_FULLDRAG

I'm posting this, because it took me two hours to find the issue. I wanted to customize a listview's header control, i.e. changing its behavior when the user resizes a column. According to the MSDN d...

weixin_30583563的博客 257

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

限制CListCtrl列的宽度

BOOL   CMyListCtrl::OnNotify(WPARAM   wParam,   LPARAM   lParam,   LRESULT*   pResult)       {     HD_NOTIFY   *pHDNotify   =   (HD_NOTIFY*)lParam;                           if(   pHDNotify->

itjobtxq的专栏 1400

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

ClistCtrl关于标题项目左右移动响应

void CTransListCtrl::OnBegintrack(NMHDR* pNMHDR, LRESULT* pResult) {  HD_NOTIFY *phdn = (HD_NOTIFY *) pNMHDR;  // TODO: Add your control notification handler code here    *pResult = 0; } void

maxiaosheng521的专栏 783

Windows程序设计18:Win32窗口列表控件的被动消息响应

Windows程序设计18:Win32窗口列表控件的被动消息响应。

qq_59940419的博客 861

MFC对话框程序中列表控件(CListCtrl)的响应消息

缩写 注解 HDN Header Notify LVN ListView control Notify NM Notify Message TVN TreeView control Notify 响应消息 解析 HDN_BEGINTRACK 开始拖动控件顶部的分割线 HDN_BEGINDRAG 开始拖动控件顶部的分栏(item) HDN_BE...

迪迦 • 奥特曼 1339

MFC对话框程序中列表控件(CListCtrl)的响应消息简介

缩写 注解 HDN Header Notify LVN ListView control Notify NM Notify Message TVN TreeView control Notify 响应消息 解析 HDN_BEGINTRACK 开始拖动控件顶部的分割线 HDN_BEGINDRAG 开始拖动控件顶部的分栏(item) HDN_BEGINFILTEREDIT 开始过滤器编辑(filter edit) LVN_BEGINDRAG 鼠标左键正在...

lucky7986的博客 1278

隐藏ListCtrl中指定列(拖动不显示)

使用下面的类,将需要隐藏的列的列宽设为0,设置m_nHideColumn为需要隐藏的列即可#pragma once // CMyListCtrl class CMyListCtrl : public CListCtrl { DECLARE_DYNAMIC(CMyListCtrl) public: CMyListCtrl(); virtual ~CMyListCt

c3764的专栏 1472

用WM_PAINT解决ListView控件嵌入Edit显示不正常的问题

ListView自带有编辑功能,创建窗口时加上一个style code就可以。但它的编辑功能只能编辑每行第一个元素。所以只能把Edit控件嵌入到ListView里。这里有两个办法,1是捕捉单击、双击动作,根据点击位置动态显示一个Edit Control。2是直接在每行都设置一个Edit,动态控制各个Edit的位置及其显隐。我参考了CustomListCtrlDemo,也是把控件嵌入ListView中

tomwillow的博客 475

自绘控件的4种方法

在您决定开发 Windows 提供的常规免费自定义控件范围之外的控件之后,您必需确定自己的控件将有多少独到之处 — 在功能和外观两方面。例如,我们假定您正在创建一个类似于计速表的控件。由于公共控件库 (ComCtrl32.dll) 中没有类似的控件,您完全需要自己进行以下操作:编写所有控件功能需要的代码,进行绘制,默认终端用户的交互,以及控件与其父窗口之间需要的任意消息处理。 (#add 两方面...

blogfeifei 794

list control 获取对应关系

获取一个界面内多个list control框索引 void CCheckReportDlg::OnHdnItemchangedList1(NMHDR *pNMHDR, LRESULT *pResult) { LPNMHEADER phdr = reinterpret_cast(pNMHDR); // TODO: 在此添加控件通知处理程序代码 LPNMITEMACTIVATE temp = (LPNMITEMACTIVATE)pNMHDR;//将传进来的消息转换成LPNMITEMACTIVAT int n =

admin_226的博客 162

CListCtrl的重绘

装载自http://blog.youkuaiyun.com/hurryboylqs/article/details/5858997 自绘一个item我相信大部分人都在10分钟内能搞定 但是绘制非item部分的区域,同学们就傻眼了,不知道如何下手 CListCtrl的绘制机制在windows里做了一个优化,就是一个绘制循环通知过程 之所以不在OnPaint中画是考虑效率上的原因,好了我们看下这个绘制循环: CD...

qq_43080331的博客 2282
上一篇: duoview1
下一篇: Dlg访问
uda1985
博客等级 码龄17年 39粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值