当前位置:C++技术网 > 精选软件 > 什么样的矩形是空矩形?如何判断和设置空矩形?

什么样的矩形是空矩形?如何判断和设置空矩形?

更新时间:2015-12-29 10:25:56浏览次数:1+次

    我已经讲解了一系列的函数包括填充矩形、画矩形边框、移动矩形、调整矩形大小、合并或者求举行交集和判断点是否在矩形内部。基本上每一个函数都结合背景知识展开讲述,也结合了大量的项目经验来讲述函数的原理和使用。为了完整性,最后将赋值相关的几个函数讲述一下,并解释我们自己实现的对等代码。
    我们最开始学习矩形,都是从最基本的赋值开始的,然而我们都是用手动将结构体的值一个一个的赋值,代码变得冗长。比如我们想创建一个空矩形。那么我们一般的做法就是:
RECT rect;
rect.left=0;
rect.top=0;
rect.right=0;
rect.bottom=0;
    然而Windows中已经有写好的一个置空函数:
SetRectEmpty(LPRECT lpRect);//传入一个RECT结构体变量,函数将执行上面一段代码一样的效果
    虽然这个函数没有什么好讲的,不过列出来,纯粹是让你知道有这么一个函数的存在,可以简化你的代码。当然,我还是多余说一下,什么是空矩形。一个点是不是空矩形?当然不是!一个点虽然只占据一个点的位置,但无论如何他也是有“窝”的。空矩形则是一无所有!
    如何来确定一个矩形是否为矩形?你以为将所有结构体成员都置为0就表示你懂得了空矩形含义吗?这是最感官的理解。实际上,要根据Windows对于矩形的定义来理解空矩形。你可以先看看文章《FillRect、FrameRect与Rectangle矩形绘制函数使用对比分析》,这篇文章图解了矩形的模型。那么矩形的宽和高分别为:rect.right-rect.left,rect.bottom-rect.top。这也和矩形模型一致,指定的参数的右下角的坐标实际上不是矩形范围内的。所以才可以这么直接相减得到宽度和高度。所以,通过这个计算完得到的矩形是空的。而如果是一个点,那么矩形的结构体应该是这样的:
RECT rect;
rect.left=0;
rect.top=0;
rect.right=1;
rect.bottom=1;

   这样就得到矩形是坐标(0,0)上的点。此矩形宽度和高度的计算:rect.right-rect.left=1-0=1,rect.bottom-rect.top=1-0=1,即1x1大小的矩形。如下图所示:

一个点(像素)大小的矩形,并不是空矩形

【一个点(像素)大小的矩形,并不是空矩形】
    真正要设置空矩形,就是要保证矩形计算得到的宽度和高度都为0,并不一定是RECT成员都为0。你将RECT的left和right设置为一样,将top和bottom设置为一样,left和top不需要一样。如下面的两种设置:
RECT rect1,rect2;
rect1.left=10;
rect1.top=10;
rect1.right=10;
rect1.bottom=10;

rect2.left=10;
rect2.top=20;
rect2.right=10;
rect2.bottom=20;
    这样得到的rect1和rect2都是空矩形!切忌不要浮于表面。即使是这么简单的问题,你也可能看不懂哦。相信这么解释之后,你才知道空矩形原来也可以这样!其实是大家都没有透过现象看本质而已。
    如果你不信,你就可以用下面这个函数来判断矩形是否为空。此函数为:
bool IsRectEmpty(LPRECT lpRect)//如果矩形为空,返回true(非零),否则返回false(零)
    所以这样检测就可以了:
if (IsRectEmpty(&rect1))
{
    MessageBox(hwnd,_T("空矩形"),_T("空矩形"),0);
}
if (IsRectEmpty(&rect2))
{
    MessageBox(hwnd,_T("空矩形"),_T("空矩形"),0);
}  
    然而如果我们想快速设置一个矩形为空,一般都默认设置为全零即可。内存可以初始化为全零。当然还有一个不错的函数,SetRectEmpty(LPRECT lpRect),这样一个函数搞定四个成员的赋值。也是简化代码的行为,没有什么特别的。
    我想看完本文,你应该不会对一些很简单看似很白痴的问题随口说就这样这样了吧。简单的东西其实也是很需要思考的!学习时请尽量做到,简单的问题发散思维想!这样你才看得到不简单的地方!