上一篇博客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"));
}
}
一番尝试后,对各个参数的含义一清二楚。