MFC矩形、窗体与图像宽高:差1且不同

一.矩形

         在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矩形的rightbottom两条边仅用于辅助,并不属于矩形自身。


 二.图像

         在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。        

         因此,窗体对应的矩形也符合rightbottom1的原则。

        

四.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()函数,或者使用边界为1Rectangle()函数,其绘制的矩形符合rightbottom1的原则。

         使用其他边界宽度的Rectangle()函数,则要注意计算其rightbottom

 总之:除图像外,MFC中一切矩形操作都认为矩形是缺少rightbottom的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值