我使用WinApi创建了树视图控件。我想捕获鼠标单击复选框。通知消息NM_CLICK包含NMHDR,它没有关于被点击的节点的信息。由于单击的节点可能与所选节点不同,因此应该有一种方法可以找到已选中或取消选中的节点,可能是HTREEITEM,或者在向树视图添加项目时插入了lParam。我想实时捕获检查/取消检查。如何指定要检查/取消选中的节点?任何帮助或链接赞赏。 mr.abzadeh
答案 0 :(得分:1)
我想实时捕捉检查/取消检查。我怎么能够 指定要检查/取消选中的节点?
现有通知TVN_ITEMCHANGING和TVN_ITEMCHANGED - 查找NMTVITEMCHANGE
的uStateNew
和uStateOld
成员 - 当树状视图有复选框时{{1}它用作状态图像列表,包含2个图像 - TVS_CHECKBOXES
和unchecked
。
所以checked
在没有复选框时为state & TVIS_STATEIMAGEMASK
,0
为未选中,INDEXTOSTATEIMAGEMASK(1)
为已选中。根据这些信息,我们可以捕捉鼠标点击复选框
使用TVN_ITEMCHANGING,您还可以在此通知返回TRUE时阻止更改。如果您只需要通知 - 请使用TVN_ITEMCHANGED
INDEXTOSTATEIMAGEMASK(2)
还阅读了How to Work With State Image Indexes
case WM_NOTIFY: { union { LPARAM lp; NMTVITEMCHANGE *pnm; NMHDR* phdr; }; lp = lParam; switch (phdr->code) { case TVN_ITEMCHANGING: { UINT CheckStateOld = pnm->uStateOld & TVIS_STATEIMAGEMASK; UINT CheckStateNew = pnm->uStateNew & TVIS_STATEIMAGEMASK; if (CheckStateNew != CheckStateOld) { PCSTR szstate = "??"; switch (CheckStateNew) { case INDEXTOSTATEIMAGEMASK(1): szstate = "uncheck"; break; case INDEXTOSTATEIMAGEMASK(2): szstate = "check"; break; } DbgPrint("%p>%s\n", pnm->lParam, szstate); } } return FALSE; } }
通知TVN_ITEMCHANGING和TVN_ITEMCHANGED从Windows Vista开始提供。如果你也需要XP支持 - 在xp上只有选项使用@IInspectable solution
答案 1 :(得分:0)
在给定客户相对坐标的情况下,您可以发送TVM_HITTEST消息(或使用TreeView_HitTest宏)查找树视图项。
要在生成NM_CLICK
消息时获取光标位置,请使用GetMessagePos API。
这允许您监视控件的客户端区域中的任何鼠标单击。如果您对标准树视图控件实现的结果感兴趣,则可以处理TVN_ITEMCHANGING或TVN_ITEMCHANGED通知。两者都提供NMTVITEMCHANGE结构,其中hItem
标识要更改的项目,lParam
包含特定于应用程序的数据。