当前位置:C++技术网 > 资讯 > 控件点击HitTest测试与调试

控件点击HitTest测试与调试

更新时间:2015-06-23 17:10:33浏览次数:1+次

    我们常用的控件,如树控件、列表控件,常常有复选框,项图标等,为了精确的得到点击控件时位置从而做出不同的处理时,我们就需要进行点击测试。
    测试实现思路基本过程:
    先设置控件的焦点SetFocus,然后获得单击时的鼠标光标的屏幕坐标GetCursorPos,然后将坐标转换成相对于控件的客户区的坐标即调用控件类对象的成员函数ScreenToClient,然后调用控件类对象的HitTest函数,就得到一个状态标志组合位,在测试函数第二个参数接收。然后使用标志“位与”控件的位置宏,如树控件的图标位置TVHT_ONITEMICON。如果得到的位与结果为真则说明单击到了图标,否则没有。其他标志类似。
    上面讲述了基本过程,具体的函数使用,请查阅MSDN。
    问题也在偶尔中遇见,我在调试时,为了验证单击测试后所返回的项的句柄,在测试的最开始处即单击测试代码开始之前设置了一个断点,然后调试进入,结果发现得到的项句柄始终为空。最后反复研究才发现,正常执行是正确的,因为在后面设置了一个消息框,正常执行时可以弹出来。
    后来想想,在朋友的提醒下,调试模式中和正常执行有多差别。在调试中,程序的消息顺序有所改变。
    仔细分析代码和改变断点的设置,结果发现,将断点设置在获得光标函数后面就可以得到正确的句柄值,而在获取光标位置函数以及前面部分设置断点则得到的句柄为空(错误的句柄值)。
    也就是说,在获得光标位置之前如果中断,会打断获取正确的光标值,从而使后面的测试始终不会落在应有的位置。虽然光标值是有的,但是却不是相对于控件所在的对话框的光标位置,而是屏幕的位置了。因为运行到断点时,界面进入到了IDE的代码编辑界面,此时的光标则是相对于的并不是那个控件所在的对话框的了,具体是哪一个,不太清楚,没有去仔细研究,如果你有兴趣,可以研究下。不过可以确定的是,这样就改变了代码的执行结果。
    如果真要设置断点调试,一定要注意位置,而不要随便设置一个位置,或者使用消息框的形式测试一个运行流程。