关于TreeView控件-改进版

针对原有TreeView控件在处理WM_LBUTTONUP时存在的问题,改进版通过捕获控件notify而非直接捕获鼠标事件的方式,利用消息反射机制解决。改进后的控件不再出现之前的问题,并且简化了父窗口处理UM_CHECKSTATECHANGE时的逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【原文写于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控件
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值