关于TreeView控件-改进版

2023-12-11 21:38
文章标签 控件 treeview 改进版

本文主要是介绍关于TreeView控件-改进版,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【原文写于2005年3月12日15:36星期六,注】

关于TreeView控件-改进版
   上一篇的《关于TreeView控件》中存在许多问题。其中最突出的是由于在CMyTreeCtrl中不能捕获WM_LBUTTONUP而导致
   改进版解决了这个问题。其主要思想是不再直接捕获鼠标事件,而是捕获控件notify
   WM_NOTIFY是控件发给父窗口的“通知”消息,利用Windows的“消息反射(Message Reflection)”机制,能够将WM_NOTIFY返回给自己,同时决定该WM_NOTIFY是否再发给父窗口
   具体实现:

代码

.h
afx_msg BOOL OnClick(NMHDR* pNMHDR, LRESULT* pResult);

.cpp
ON_NOTIFY_REFLECT_EX(NM_CLICK, OnClick)

BOOL CMyTreeCtrl::OnClick(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
CPoint pt(::GetMessagePos()) ;
::MapWindowPoints(HWND_DESKTOP, GetSafeHwnd(), &pt, 1);

TVHITTESTINFO tvHitInfo = { pt.x, pt.y } ;

HitTest(&tvHitInfo) ;

if (tvHitInfo.flags & TVHT_ONITEMSTATEICON)
GetParent()->PostMessage(UM_CHECKSTATECHANGE, WPARAM(GetDlgCtrlID()), LPARAM(tvHitInfo.hItem)) ;

*pResult = 0;

return FALSE ;
}

   OnClick负责处理TreeView控件消息NM_CLICK
   最后return FALSE表示NM_CLICK依然发给父窗口
   其它细节请参考上一篇的 《关于TreeView控件》

   改进后,CMyTreeCtrl不再出现原来处理WM_LBUTTONDOWN导致的问题,父窗口处理UM_CHECKSTATECHANGE时也不必再采用相反的逻辑
   改进后,与MSDN的做法一样,需要GetMessagePos()和MapWindowPoints(),但是我觉得,MSDN的做法,对话框(或父窗口)与TreeView控件间耦合太紧。如果上述的CMyTreeCtrl再完善一下封装,能实现一个真正的支持“CheckNotify”的TreeView控件
 

这篇关于关于TreeView控件-改进版的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/482198

相关文章

lvgl8.3.6 控件垂直布局 label控件在image控件的下方显示

在使用 LVGL 8.3.6 创建一个垂直布局,其中 label 控件位于 image 控件下方,你可以使用 lv_obj_set_flex_flow 来设置布局为垂直,并确保 label 控件在 image 控件后添加。这里是如何步骤性地实现它的一个基本示例: 创建父容器:首先创建一个容器对象,该对象将作为布局的基础。设置容器为垂直布局:使用 lv_obj_set_flex_flow 设置容器

小程序button控件上下边框的显示和隐藏

问题 想使用button自带的loading图标功能,但又不需要button显示边框线 button控件有一条淡灰色的边框,在控件上了样式 border:none; 无法让button边框隐藏 代码如下: <button class="btn">.btn{border:none; /*一般使用这个就是可以去掉边框了*/} 解决方案 发现button控件有一个伪元素(::after

MFC中Spin Control控件使用,同时数据在Edit Control中显示

实现mfc spin control 上下滚动,只需捕捉spin control 的 UDN_DELTAPOD 消息,如下:  OnDeltaposSpin1(NMHDR *pNMHDR, LRESULT *pResult) {  LPNMUPDOWN pNMUpDown = reinterpret_cast(pNMHDR);  // TODO: 在此添加控件通知处理程序代码    if

MFC 控件重绘(2) NM_CUSTOMDRAW, WM_DRAWITEM, 虚函数DrawItem

控件重绘有三种方法: 1 设定界面属性 2 利用Windows的消息机制,通过Windows消息映射(Message Mapping)和反映射(Message Reflecting),在合适的时机修改控件的状态和行为。此方式涉及NM_CUSTOMDRAW和WM_DRAWITEM 3 利用虚函数机制,重载虚函数。即DrawItem虚函数。 对于NM_CUSTOMDRAW,某些支持此消息的控件

C# 通过拖控件移动窗体

目录 引言一、通过控件事件移动窗体1、创建窗体界面2、添加控件事件3、添加代码 二、通过windowsAPI移动窗体1、 构建窗体和添加事件2、代码展示 引言 在C#Form窗体设计中,如果我们不需要使用默认边框设计自己个性化的窗体(FromBorderStyle=none时),这时候你会发现拖动窗体的功能就没有了,这里需要自己构建方法让用户可以拖动整个窗体,这里我们使用前辈的

Qt-常用控件(3)-多元素控件、容器类控件和布局管理器

1. 多元素控件 Qt 中提供的多元素控件有: QListWidgetQListViewQTableWidgetQTableViewQTreeWidgetQTreeView xxWidget 和 xxView 之间的区别,以 QTableWidget 和 QTableView 为例. QTableView 是基于 MVC 设计的控件.QTableView 自身不持有数据,使用 QTab

ASP.NET手动触发页面验证控件事件

开发环境:.NET Framework 3.5.1 sp1 参考文章: http://www.codeproject.com/KB/aspnet/JavascriptValidation.aspx http://msdn.microsoft.com/zh-cn/library/aa479045.aspx http://www.cnblogs.com/minsentinel/archive/

兔子--计算listview的高度,解决listview与scrollview控件冲突

/** * 计算ListView的高度 * * @param listView */ public void setListViewHeightBasedOnChildren(ListView listView) { // 获取ListView对应的Adapter OrderGoodsAdapter listAdapter = (OrderGoodsAdapter) listView.getAda

QT:QWidget 控件属性的介绍

控件属性介绍 🌴enabled 状态属性🌴geometry 几何属性示例一:改变控件尺寸示例二:更变控件位置window frame 的影响 🌴windowTitle 窗口标题🌴windowIcon 窗口图标🌴 qrc机制🌴windowOpacity 窗口透明度🌴cursor 修改鼠标显示样式示例一:通过编辑区直接修鼠标显示样式示例二:通过代码的方式设置鼠标在控件的显示效果示例