gdi + Graphics类中FillRectangle,DrawRectangle和SetClip之间的行为不一致

时间:2018-01-24 03:42:59

标签: windows gdi+

首先,我知道这篇文章: Pixel behaviour of FillRectangle and DrawRectangle。但它并没有完全解决我的问题。

让我们从长度为3的正方形开始,如下所示:

RectF rc(0, 0, 3, 3);

如果我使用Graphics::FillRectangle()填充此矩形,那么我会得到一个3 x 3像素的正方形,如下图所示,带有2个小白方块:

enter image description here

如果我然后尝试使用Graphics::DrawRectangle()在这些正方形周围绘制边框,并提供与我填充时使用的完全相同的矩形,我会得到一个覆盖4 x 4像素的边框,从而在视觉上通过右侧和底部的像素:

enter image description here

我被理解这是因为FillRectangle()没有绘制右边或底边。我无法找到有关其行为方式的任何文档。

如果我然后将Graphics::SetClip()带入等式,并将剪切区域设置为我在之前的2个测试中使用的同一个矩形,我得到以下内容:

enter image description here

所以,现在裁剪区域似乎忽略了右边缘和底边缘,就像FillRectangle()所做的那样,这看起来很愚蠢DrawRectangle()。{/ p>

有人可以帮助我理解应该如何解释所有这些不一致吗?

1 个答案:

答案 0 :(得分:1)

FillRectangleSetClip忽略右边和底边,因为这是Windows中矩形的定义;它是两个开放范围,其中包括起点但终点不包括。这意味着您可以轻松定义矩形,其中top = bottom或left = right。这也意味着如果一个矩形的顶部是另一个矩形的底部,那么这两个矩形将完美地相遇而没有重叠。

DrawRectangle是不同的,因为它定义了一个带有4个边并绘制这些边的多边形。