树形视图和列表视图中的HitTest

VC++ MFC高仿QQ好友列表:自绘控件、双缓冲与消息处理实战 在Windows桌面应用开发中,自定义控件是实现复杂、高性能用户界面的核心技术。其原理基于Windows消息驱动机制,通过处理WM_PAINT等消息,利用GDI/GDI+进行底层绘图,从而实现对界面元素的像素级控制。这项技术的核心价值在于能够突破标准控件的限制,打造独特交互体验,并优化性能,尤其适用于需要高频刷新或精细视觉呈现的场景,如即时通讯软件的好友列表、数据监控仪表盘等。本文以经典的VC++ MFC框架为例,深入剖析如何从零构建一个支持分组展开折叠、在线状态显示、头像展示及拖拽操作的高仿QQ好友列表控 阅读详情


1、引言

      HitTest为命中测试的意思。在使用MFC编写程序的时候,在树形视图以及列表视图中通常会涉及到需要获得鼠标当前位置所对应的元素。这种通过光标坐标位置来获得相应元素项的操作我们称之为命中测试。

在树形视图中使用HTREEITEM类型变量来表示视图中的元素项,而在列表视图中可以直接使用整型变量的编号来表示列表视图中对应的元素项。通过调用HitTest()方法,并为其传递一个CPoint位置变量即可获得相应的元素项。

2、获得鼠标光标位置

     使用API函数::GetMessagePos()可以获得当前光标的坐标信息,具体操作代码如下:

 

        DWORDdwPos = ::GetMessagePos();                                 //获得包含坐标信息的DWORD类型值

        CPointpt(LOWORD(dwPos), HIWORD(dwPos));                //将坐标值转换为CPoint类型

        ScreenToClient(&pt);                                                                //将屏幕坐标转换为窗口客户区坐标

 

     ::GetMessagePos()函数会返回一个4字节DWORD类型的值,该值中低二个字节包含了光标所在屏幕中x坐标值,高两个字节包含了屏幕中y坐标值。通过LOWORD()和HIWORD()宏即可提取低二字节和高二字节值。因为树形视图和列表视图控件中命中测试使用的是客户区坐标,所以还需要使用ScreenToClient()函数进行转换。

3、树形视图命中测试

     在树形视图中可以直接调用HitTest()方法实现命中测试。HitTest()方法会返回一个HTREEITEM类型变量,用来表示当前光标位置处所对应的元素。实现代码如下所示:

 

        DWORDdwPos = ::GetMessagePos();

        CPointpt(LOWORD(dwPos), HIWORD(dwPos));

        ScreenToClient(&pt);                                                                //得到树形视图客户区坐标

 

        HTREEITEMhSelItem = GetTreeCtrl().HitTest(pt);             //获得当前坐标位置对应的树形视图元素

        if(hSelItem != NULL)

        {

                  //命中测试成功

        }

 

如果HitTest()方法返回NULL,则表示当前光标位置坐标处没有相对应的树形视图元素。

4、列表视图命中测试

     在列表视图中也有对应的HitTest()方法,不同的是:列表视图中HitTest()方法返回的是一个整型变量值用来表示列表视图中对应的元素。实现代码如下所示:

        DWORDdwPos = ::GetMessagePos();

        CPointpt(LOWORD(dwPos), HIWORD(dwPos));

        ScreenToClient(&pt);

 

        if(GetListCtrl().HitTest(pt) != -1)

        {

                  //命中测试成功

        }

 

     在列表视图中如果HitTest()方法返回-1,则表示当前光标位置坐标处没有相对应的列表视图元素。

MFC自定义弹出式菜单实战:从CMenu类到TrackPopupMenu高级应用 弹出式菜单作为经典的桌面软件交互元素,其核心原理是通过资源定义与动态加载实现按需触发的快捷操作。在Windows编程中,菜单资源管理与消息映射机制构成了其技术基础,CMenu类作为菜单控制器,通过LoadMenu加载资源、GetSubMenu获取子菜单、TrackPopupMenu控制显示位置与行为。这种设计模式在嵌入式上位机、工控软件等对交互效率要求高的场景中价值显著,能够提升操作的专业性与用户体验。本文以MFC框架为例,深入解析如何为CListCtrl等控件实现智能右键菜单,涵盖坐标转换、动态菜单项更新 阅读详情

相关推荐

MATLAB Figure工具条UX设计:从上下文感知到效率提升的交互重构

在数据可视化领域,图形用户界面(GUI)的交互设计直接影响着工程师和科研人员的工作效率。其核心原理在于通过理解用户意图,将静态功能列表转化为动态的智能助手。这项技术的核心价值在于显著降低认知负荷,缩短从数据到见解的路径。在实际应用中,尤其在科学计算与工程仿真场景,一个设计精良的交互界面能流畅支持从快速出图到出版级图表美化的完整工作流。本文聚焦于MATLAB Figure工具条的现代化改造,深入探讨如何通过引入上下文感知和渐进式披露等UX设计原则,解决传统工具条在功能孤立与操作冗长等方面的痛点,并详细解析了基

weixin_33739646的博客 436

MFC树点击事件中CTreeCtrl::HitTest用法以及uFlag参数的不同值的含义

CTreeCtrl::HitTest的语法结构: ​​​​​​​ HTREEITEM HitTest( CPoint pt, UINT* pFlags = NULL ) const; HTREEITEM HitTest( TVHITTESTINFO* pHitTestInfo ) const;  参数的取值及含义: Value 含...

acoolgiser的博客 4765

MATLAB 2022b 用户专属:保姆级IPOPT求解器安装配置全流程(含OPTI工具箱)

本文为MATLAB 2022b用户提供IPOPT求解器的详细安装与配置指南,涵盖OPTI工具箱的适配安装、环境变量设置及常见问题解决方案。通过实战案例演示非线性优化问题的求解过程,帮助用户高效部署这一强大的优化工具,提升工程计算效率。

weixin_29092031的博客 405

mfc hittest 使用方法

1.背景 HitTest为命中测试的意思。在使用MFC编写程序的时候,在树形视图以及列表视图中通常会涉及到需要获得鼠标当前位置所对应的元素。这种通过光标坐标位置来获得相应元素项的操作我们称之为命中测试。2.相关函数 GetMessagePos() :可以获得当前光标的坐标信息 GetCursorPos() :该函数检取光标位置

普雷的博客 4306

平衡电桥检测高压绝缘电阻的原理

检测绝缘漏电的高压拓扑如下:BMU需要连接BAT+,BAT-和PE线,并测量电池总压(Ubatt)和负母线电压(Un),并计算出正母线电压(Up)。

booksyhay的专栏 1万+

智慧楼宇解决方案-全套大合集

智慧楼宇解决方案,楼宇能耗-环境-设备统一管控解决方案。

byte58的博客 2592

MFC中树控件节点的点击位置的判断,涉及CTreeCtrl::HitTest()方法的参数值pFlags的含义区别及用法(pFlags值测试)

上一篇博客https://blog.youkuaiyun.com/acoolgiser/article/details/81330200提到了HitTest()方法,但是还没有说清楚用法,本文再通过测试来深入理解。    首先看一下MSDN中关于CTreeCtrl::HitTest()方法的用法说明: https://msdn.microsoft.com/zh-cn/library/x0w7ft34.a...

acoolgiser的博客 1806

[LaTeX] 调整参考文献的格式(References),包括作者名缩写,行距,字体,引用顺序等等

在此记录我对LaTeX中参考文献references的尝试,主要涵盖如题几个方面。

the Blog of 等不到天亮丶等时光 4万+

MFC函数随看随记

POINT pt;     GetCursorPos(&pt);//该函数检取光标的位置,以屏幕坐标表示     UINT uFlags;     ScreenToClient(&pt);  //该函数把屏幕上指定点的屏幕坐标转换成用户坐标。     MapWindowPoints(this, &pt,1);//该函数把相对于一个窗口的坐标空间的一组点映射成相对于另一窗口的坐标空间的一组点

u011365452的专栏 895

概率论 知识图谱 + 实战案例解析

本文通过构建概率论知识图谱,系统梳理了从随机试验、概率、条件概率到随机变量与分布的核心概念及其内在联系。结合朴素贝叶斯分类器和蒙特卡洛模拟等实战案例,深入解析了条件概率、独立性及大数定律等理论如何应用于机器学习与实际问题求解,旨在帮助读者建立结构化思维,将理论有效转化为解决实际问题的能力。

weixin_29051193的博客 267

【Hypermesh】TetraMesh Panel 常用选项详解

结合Hypermesh 2020 帮助文档和自己的一点使用经验,整理了这个博客。

qgm1702的博客 3677

VC++实现高性能目录选择下拉树控件:MFC/Win32动态加载与异步优化

在Windows桌面应用开发中,文件系统交互是基础且高频的需求,涉及文件浏览、路径选择等核心功能。其原理基于操作系统提供的文件API(如FindFirstFile)和GUI框架的控件机制,通过树形结构直观展示目录层级。这项技术的价值在于提升应用的专业性和用户体验,替代系统默认对话框,实现更流畅的交互。在工程实践中,常应用于安装程序、配置工具、资源管理器等需要深度定制界面的场景。本文聚焦于利用VC++(MFC/Win32)实现一个嵌入式的目录选择下拉树控件,重点解决了动态加载和异步优化等性能瓶颈,确保控件在大

cuemes08808的博客 486

【100%通过率】华为od 机试真题 C语言 实现【补种未成活胡杨】

近些年来,我国防沙治沙取得显著成果。某沙漠新种植N棵胡杨(编号1-N),排成一排。一个月后,有M棵胡杨未能成活。现可补种胡杨K棵,请问如何补种(只能补种,不能新种),可以得到最多的连续胡杨树?

MISAYAONE的博客 1654

MATLAB App Designer组件批量管理与智能标签系统实战

在GUI开发中,组件管理与样式统一是提升开发效率的关键。通过理解组件对象模型与属性复制原理,可以实现类似设计软件的格式刷功能,批量同步视觉属性与回调逻辑。结合元数据管理思想构建的智能标签系统,支持多标签分类与快速检索,解决了复杂界面下的组件定位难题。这些技术显著提升了MATLAB App Designer在工程实践中的开发效率,尤其适用于需要快速迭代的数据仪表盘、科学计算界面等应用场景。本文通过实战代码,详细解析了组件属性交换引擎与标签管理系统的实现,帮助开发者构建高效的GUI开发工作流。

dengkuituo0680的博客 372

YOLOv8与注意力机制融合:EMA(高效多维注意力)的原理剖析与实战应用

本文介绍了如何在YOLOv8目标检测模型中集成EMA(高效多尺度注意力)机制。主要内容包括:EMA注意力机制的工作原理解析,展示其多尺度特征融合和高效计算特性;详细的环境配置与依赖安装指南;EMA模块的完整代码实现,包含分组处理、空间注意力权重计算和特征融合等关键步骤;以及将EMA集成到YOLOv8网络结构的方法。通过添加EMA模块,可以提升模型对关键特征的关注能力,有效抑制背景干扰,从而增强目标检测性能。本教程提供了从原理到实现的完整解决方案。

m0_64661770的博客 147

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

MFC API——》WM_NCHITTEST、OnNcHitTest (CPoint point) 点击鼠标时产生的消息

这个消息比较实用也很关键,它代表非显示区域命中测试。这个消息优先于所有其他的显示区域和非显示区域鼠标消息。其中lParam参数含有鼠标位置的x和y屏幕坐标,wParam 这里没有用。 Windows应用程序通常把这个消息传送给DefWindowProc,然后Windows用WM_NCHITTEST消息产生与鼠标位置相关的所有其他鼠标消息。通俗的讲从消息产生消息。 case WM_NCHITTE

liuxiaomao1988的专栏 2654

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

hitTest的作用与用法

hitTest的作用:当在一个view上添加一个屏蔽罩,但又不影响对下面view的操作,也就是可以透过屏蔽罩对下面的view进行操作,这个函数就很好用了。   hitTest的用法:将下面的函数添加到UIView的子类中,也就是屏蔽罩类中即可。   -(id)hitTest:(CGPoint)point withEvent:(UIEvent *)event

鹰击长空 5462

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

如何正确使用TreeView的HitTest方法?

<br />Q:如何正确使用TreeView的HitTest方法?<br /> A:在TreeView控件 中有一个非常有用的方法HitTest,其功能 是返回指定坐标的节点对象 。其语法如下:<br />object.HitTest(x As Single, y As Single)<br /> 其中x和y代表坐标点,但必须要注意的是这里的x和y表示的是单位缇。任何数值 必须转换为相应的缇才能正确得到HitTest的返回结果 。<br /> 参考以下示例。本例中利用MouseMove事件和

阿木的学习天地 2335

得到1

<br />// HitTestEx   - Determine the row index and column index for a point// Returns     - the row index or -1 if point is not over a row// point       - point to be tested.// col         - to hold the column indexint CMyListCtrl::HitTestEx(CPoint

uda1985的专栏 924

MFC CTreeView学习之右键菜单_获取选中节点的方式HitTest和GetSelectedItem的区别(二)

CPoint pt; UINT nFlags; GetCursorPos(&pt); ::ScreenToClient(m_TreeCtrl->m_hWnd, &pt); HTREEITEM hItem2 = m_TreeCtrl->HitTest(pt, &nFlags); //获取选中节点  注:此处获取的是当前选中的节点 CString sMsg; sMsg.Format(_

Zohar的博客 3140

CTreeCtrl的HitTest用法

//来源:http://blog.youkuaiyun.com/goingup/article/details/2932767 CtreeCtrl的HitTest函数能够得到与当前鼠标位置相关的项。 该函数可以实现,在带有checkbox的树中,当选中父节点的checkbox, 子节点的checkbox可自动选中。因为可以得到父节点的HTREEITEM ,根据这个属性可以遍历子节点。 void

求真,务实。 814

MFC树形控件CTreeCtrl使用方法、遍历、SetCheck无效、根据名称获取节点、获取选中节点等问题

MFC树形控件CTreeCtrl使用方法:遍历所有节点、根据名称获取节点、获取选中节点等,解决了树形控件在对话框初始化时SetCheck无效问题

小沈的专栏 1万+
上一篇: VC++中隐藏代码
下一篇: 删除文件到回收站rm命令
zcube
博客等级 码龄17年 170粉丝 120原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值