如何捕获单击的树视图节点

时间:2017-01-03 00:14:06

标签: c winapi treeview

我使用WinApi创建了树视图控件。我想捕获鼠标单击复选框。通知消息NM_CLICK包含NMHDR,它没有关于被点击的节点的信息。由于单击的节点可能与所选节点不同,因此应该有一种方法可以找到已选中或取消选中的节点,可能是HTREEITEM,或者在向树视图添加项目时插入了lParam。我想实时捕获检查/取消检查。如何指定要检查/取消选中的节点?任何帮助或链接赞赏。 mr.abzadeh

2 个答案:

答案 0 :(得分:1)

  

我想实时捕捉检查/取消检查。我怎么能够   指定要检查/取消选中的节点?

现有通知TVN_ITEMCHANGINGTVN_ITEMCHANGED - 查找NMTVITEMCHANGEuStateNewuStateOld成员 - 当树状视图有复选框时{{1}它用作状态图像列表,包含2个图像 - TVS_CHECKBOXESunchecked

所以checked在没有复选框时为state & TVIS_STATEIMAGEMASK0为未选中,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_ITEMCHANGINGTVN_ITEMCHANGED从Windows Vista开始提供。如果你也需要XP支持 - 在xp上只有选项使用@IInspectable solution

答案 1 :(得分:0)

在给定客户相对坐标的情况下,您可以发送TVM_HITTEST消息(或使用TreeView_HitTest宏)查找树视图项。

要在生成NM_CLICK消息时获取光标位置,请使用GetMessagePos API。

这允许您监视控件的客户端区域中的任何鼠标单击。如果您对标准树视图控件实现的结果感兴趣,则可以处理TVN_ITEMCHANGINGTVN_ITEMCHANGED通知。两者都提供NMTVITEMCHANGE结构,其中hItem标识要更改的项目,lParam包含特定于应用程序的数据。