当前位置:C++技术网 > 精选软件 > PtInRect函数使用细节详细分析(图解)

PtInRect函数使用细节详细分析(图解)

更新时间:2015-12-28 10:55:34浏览次数:1+次

    当你要判断一个点是否在一个矩形中的时候,你就会用到函数PtInRect。典型的应用就是打地鼠游戏,见文章《win32实现的最简单的打地鼠游戏》的分析。
    PtInRect函数使用是很简单的,不过我们这里主要是讲解一下函数使用的一些细节问题。
    既然是判断一个点是否在一个矩形内,自然要涉及到确定的矩形范围。落在边上算不算呢?或者落在那些边算是落在矩形内部呢?还是落在所有矩形边上都算是落在矩形内呢?

    下面是我们的矩形击中图模型:

左边上边和矩形内部才算是矩形真正的占用范围

【左边上边和矩形内部才算是矩形真正的占用范围】


    对于这些问题的解释,先要看看矩形绘图模型,见文章《FillRect、FrameRect与Rectangle矩形绘制函数使用对比分析》的分析。
    可以从矩形模型看出,绘制的时候,右下角的点对应的线是不会画到的。也就是说,PtInRect第一个参数的RECT矩形所描述的右边和底边都不算矩形真正的占有范围的。通过查阅MSDN,上面清楚的描述了。只有落在矩形内部、左边和上边才算是落在矩形内,右边和底边不算矩形所占的范围。
    我们来看看PtInRect函数的声明:
BOOL PtInRect(CONST RECT *lprc,POINT pt);
    函数第一个参数为RECT结构体的常量指针,表示目标的矩形结构体指针,设置为常量表示不能修改这个结构体的值。第二个参数为POINT点结构体的变量。函数就会执行检测,检测范围就和上面所讲那样。如果点的坐标在矩形范围内,则返回非零,否则返回零。
     MSDN中附加说明了,矩形结构体的值需要正常。必须确保右下角的点的坐标比左上角的点的坐标值大,而且还不能相等。相等了就没有大小了。矩形的大小就是右下角减去左上角得到。
    所以这一点要确保,否则点不会落在矩形内的。一般正常获取的矩形坐标,而不是人为设置的,不会有这个问题的。

    因为会用到不同的用途,所以矩形所用的坐标是逻辑坐标。不过我们用的MM_TEXT坐标映射模式,也就是默认的坐标映射模式,逻辑坐标和设备坐标一致,所以无需考虑这个问题。

    下面是PtInRect使用的代码样子:

RECT rect;
GetClinetRect(&rect);//获取客户区矩形大小
POINT pt;
pt.x = GET_X_LPARAM(lParam);//获取鼠标单击的光标的x坐标
pt.y = GET_Y_LPARAM(lParam);//获取鼠标单击的光标的y坐标
if(PtInRect(&rect,pt))
{
    //点在矩形内
}
else
{
    //点不在矩形内
}