1、引言
HitTest为命中测试的意思。在使用MFC编写程序的时候,在树形视图以及列表视图中通常会涉及到需要获得鼠标当前位置所对应的元素。这种通过光标坐标位置来获得相应元素项的操作我们称之为命中测试。
在树形视图中使用HTREEITEM类型变量来表示视图中的元素项,而在列表视图中可以直接使用整型变量的编号来表示列表视图中对应的元素项。通过调用HitTest()方法,并为其传递一个CPoint位置变量即可获得相应的元素项。
2、获得鼠标光标位置
使用API函数::GetMessagePos()可以获得当前光标的坐标信息,具体操作代码如下:
DWORDdwPos = ::GetMessagePos(); //获得包含坐标信息的DWORD类型值
CPointpt(LOWORD(dwPos), HIWORD(dwPos)); //将坐标值转换为CPoint类型
ScreenToClient(&pt); //将屏幕坐标转换为窗口客户区坐标
::GetMessagePos()函数会返回一个4字节DWORD类型的值,该值中低二个字节包含了光标所在屏幕中x坐标值,高两个字节包含了屏幕中y坐标值。通过LOWORD()和HIWORD()宏即可提取低二字节和高二字节值。因为树形视图和列表视图控件中命中测试使用的是客户区坐标,所以还需要使用ScreenToClient()函数进行转换。
3、树形视图命中测试
在树形视图中可以直接调用HitTest()方法实现命中测试。HitTest()方法会返回一个HTREEITEM类型变量,用来表示当前光标位置处所对应的元素。实现代码如下所示:
DWORDdwPos = ::GetMessagePos();
CPointpt(LOWORD(dwPos), HIWORD(dwPos));
ScreenToClient(&pt); //得到树形视图客户区坐标
HTREEITEMhSelItem = GetTreeCtrl().HitTest(pt); //获得当前坐标位置对应的树形视图元素
if(hSelItem != NULL)
{
//命中测试成功
}
如果HitTest()方法返回NULL,则表示当前光标位置坐标处没有相对应的树形视图元素。
4、列表视图命中测试
在列表视图中也有对应的HitTest()方法,不同的是:列表视图中HitTest()方法返回的是一个整型变量值用来表示列表视图中对应的元素。实现代码如下所示:
DWORDdwPos = ::GetMessagePos();
CPointpt(LOWORD(dwPos), HIWORD(dwPos));
ScreenToClient(&pt);
if(GetListCtrl().HitTest(pt) != -1)
{
//命中测试成功
}
在列表视图中如果HitTest()方法返回-1,则表示当前光标位置坐标处没有相对应的列表视图元素。