树形视图和列表视图中的HitTest



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,则表示当前光标位置坐标处没有相对应的列表视图元素。

转载于:https://www.cnblogs.com/zcube/p/4194533.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值