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

9 篇文章 0 订阅

上一篇博客https://blog.csdn.net/acoolgiser/article/details/81330200提到了HitTest()方法,但是还没有说清楚用法,本文再通过测试来深入理解。

 

 首先看一下MSDN中关于CTreeCtrl::HitTest()方法的用法说明:

https://msdn.microsoft.com/zh-cn/library/x0w7ft34.aspx

其中,pFlags 参数包含一个值来指定点的位置。其可能的值有很多,如下表:

含义

TVHT_ABOVE

在客户端区域。

TVHT_BELOW

在工作区中。

TVHT_NOWHERE

在工作区,但是,在最后一项下。

TVHT_ONITEM

在位图或标签与项目。

TVHT_ONITEMBUTTON

在按钮上与项目。

TVHT_ONITEMICON

在位图与项目。

TVHT_ONITEMINDENT

在缩进与项目。

TVHT_ONITEMLABEL

在标签(字符串)与项目。

TVHT_ONITEMRIGHT

在项目右边的区域。

TVHT_ONITEMSTATEICON

在一个用户定义状态的树视图项的状态图标。

TVHT_TOLEFT

在工作区左边。

TVHT_TORIGHT

在工作区的右侧。

 看了此表还是一脸懵B,通过MessageBox来测试,代码如下:

void CTreeView::OnNMClickTree(NMHDR *pNMHDR, LRESULT *pResult)

{

    // TODO: Add your control notification handler code here

    CPoint point;

    UINT uFlag; // 接收有关点击测试的信息

    GetCursorPos(&point); // 获取屏幕鼠标坐标

    m_tree.ScreenToClient(&point);

    // 点击测试,是否点击了树节点

    HTREEITEM hItem = m_tree.HitTest(point, &uFlag);



    if (NULL != hItem)
    {
        if (uFlag&TVHT_ABOVE)
            MessageBox(_T("L1:TVHT_ABOVE"));
        if (uFlag&TVHT_BELOW)
            MessageBox(_T("L2:TVHT_BELOW"));
        if (uFlag&TVHT_NOWHERE)
            MessageBox(_T("L3:TVHT_NOWHERE"));
        if (uFlag&TVHT_ONITEM)
            MessageBox(_T("L4:TVHT_ONITEM"));
        if (uFlag&TVHT_ONITEMBUTTON)
            MessageBox(_T("L5:TVHT_ONITEMBUTTON"));
        if (uFlag&TVHT_ONITEMICON)
            MessageBox(_T("L6:TVHT_ONITEMICON"));
        if (uFlag&TVHT_ONITEMINDENT)
            MessageBox(_T("L7:TVHT_ONITEMINDENT"));
        if (uFlag&TVHT_ONITEMLABEL)
            MessageBox(_T("L8:TVHT_ONITEMLABEL"));

        if (uFlag&TVHT_ONITEMRIGHT)
            MessageBox(_T("L9:TVHT_ONITEMRIGHT"));

        if (uFlag&TVHT_ONITEMSTATEICON)
            MessageBox(_T("L10:TVHT_ONITEMSTATEICON"));

        if (uFlag&TVHT_TOLEFT)
            MessageBox(_T("L11:TVHT_TOLEFT"));

        if (uFlag&TVHT_TORIGHT)
            MessageBox(_T("L12:TVHT_TORIGHT"));

    }

}

一番尝试后,对各个参数的含义一清二楚。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值