一.矩形
在MFC中,矩形的宽定义为:width= rect.right-rect.left
如矩形为:
RECT rect;
rect.left = 0;
rect.top = 0;
rect.right = 9;
rect.bottom = 9;
则矩形:
宽 = rect.right-rect.left = 9
而实际上,矩形也包括其两边,故矩形的宽理论上来说应该是rect.right-rect.left +1=10
但MFC中的规定就是width =rect.right-rect.left,也就是说MFC的矩形宽始终比理论的宽少1。
矩形的高同理,也比理论上的高少1。
MFC及windows的各种针对矩形的操作都使用了以上少1的标准。因此,实际矩形使用时应该按少1来处理。
可以这样认为:MFC矩形的right与bottom两条边仅用于辅助,并不属于矩形自身。
二.图像
在MFC中,图像的宽定义为:width= 图像.right-图像.left+1
所以,MFC中图像的宽高与理论的宽高是一致的。
由上可知,MFC中矩形与图像的宽高计算标准是不同的。
三.窗体
windows窗体的计算标准与矩形的标准是相同的,即窗体的实际宽始终比理论的宽少1。
如一个windows窗体的大小是100*100,则通过GetWindowRect()函数得到的矩形是
rect.left = 0;
rect.top = 0;
rect.right = 100;
rect.bottom = 100;
此时,矩形宽为100,窗体宽也是100,但窗体的理论宽是101。
因此,窗体对应的矩形也符合right与bottom少1的原则。
四.windows编程矩形绘制函数
windows编程中对矩形的绘制函数Rectangle()实际上是含有边的。虽然可以将其边的宽度设为0,但实际上该函数的边设定比较特殊:
例如一个矩形:
rect.left = 0;
rect.top = 0;
rect.right = 100;
rect.bottom = 100;
该矩形的计算宽度为100,实际宽度为101。
对其在不同条件下进行绘制,其结果为:
如图:
1. FillSolidRect()函数所绘制出的矩形宽度为100。也就是符合缺少右边界与下边界各1个像素的设定
2. Rectangle()函数,设边界宽度为0。则其绘制出的矩形宽度为99
3. Rectangle()函数,设边界宽度为1。则其绘制出的矩形宽度为100(含边界)
4. Rectangle()函数,设边界宽度为5。则其绘制出的矩形宽度为104(含边界)
分析以上四种情况,可知:Rectangle()函数所绘矩形会在右边界和下边界处预留1个像素。因此当边界宽为0时,预留的1个像素不会被绘制,所以就出现了宽度为99的情况;当边界宽度为1时,预留的1个像素刚好被绘制,所以宽度是正确的,为100;当边界宽度为5的时候,预留的1个像素已经不够,所以除预留像素之外还需要额外4个像素来绘制边界,所以其宽度为104。注意向外扩展仅仅对右侧和下侧的边界起作用,左侧和上侧的边界会直接占用填充区。
也就是说:
使用FillSolidRect()函数,或者使用边界为1的Rectangle()函数,其绘制的矩形符合right与bottom少1的原则。
使用其他边界宽度的Rectangle()函数,则要注意计算其right与bottom。
总之:除图像外,MFC中一切矩形操作都认为矩形是缺少right与bottom的。