GDI+ FillPolygon 包括左侧和顶部轮廓?
GDI+ FillPolygon includes the left and top outline?
我使用 GDI+ FillPolygon()
函数创建了一个梯形,但发现它在右侧和底部偏离了 1 个像素。我假设你传递了要填充的区域的点,但更仔细地阅读它说它填充了多边形的内部,因为如果它这样做的话。我实际发现的是填充函数包括左侧和顶部(x,y)但不包括右侧和底部(x,y)。简单来说,就矩形而言,填充(0,0)-(10,10)时,填充区域为(0,0)-(9,9)。我希望它是 (0,0)-(10,10) 或 (1,1)-(9,9)。毕竟给出的点都是x,y。所以我的问题是,这是设计吗?为什么没有记录?还是我错过了什么?
TIA!!
至少对于矩形,这是在(绘制矩形)[https://docs.microsoft.com/en-us/windows/win32/gdi/drawing-rectangles] 中记录的行为。此行为类似于线的工作方式(使用 LineTo 绘制),其中包含源点但不包含目标点。我不知道使用 SetWorldTransform 记录的更改是否会更改单条线的绘制方式。
我无法重现你的问题,请看下面的截图:
代码:
Graphics graphics(hdc);
SolidBrush solidBrush(Color(255, 255, 0, 0));
Point point1 = Point(0, 0);
Point point2 = Point(0, 10);
Point point3 = Point(10, 10);
Point point4 = Point(10, 0);
Point points[4] = {point1,point2,point3,point4};
graphics.FillPolygon(&solidBrush, points, 4);
如果你的代码有什么不同,请在问题中添加你的代码和截图。
更新:
我添加了一个新的截图来研究这个问题:
如果区域在 0 / 10 (1-9) 内,则 width/height 应为 9,如果包含给定 0 / 10 (0-10) 的 x,y 点,则应为 11。
不,宽度和高度应为 10 像素。如果你的意思是 DrawRectangle
,区域应该是 9x9 像素,不包括 1 像素笔。
如果使用Rectangle
,区域应为 8x8 像素,不包括 1 像素笔。
测试代码:
Pen blackPen(Color(255, 0, 0, 0), 1); //1 pixel
g->DrawRectangle(&blackPen, 0, 24, 10, 10); //10x10
Rectangle(hdc, 0, 36, 10, 46); // 10x10
RECT rect;
rect.left = 0;
rect.top = 12;
rect.right = 10;
rect.bottom = 22;
FillRect(hdc, &rect, (HBRUSH)(COLOR_WINDOW + 3)); //10x10
我使用 GDI+ FillPolygon()
函数创建了一个梯形,但发现它在右侧和底部偏离了 1 个像素。我假设你传递了要填充的区域的点,但更仔细地阅读它说它填充了多边形的内部,因为如果它这样做的话。我实际发现的是填充函数包括左侧和顶部(x,y)但不包括右侧和底部(x,y)。简单来说,就矩形而言,填充(0,0)-(10,10)时,填充区域为(0,0)-(9,9)。我希望它是 (0,0)-(10,10) 或 (1,1)-(9,9)。毕竟给出的点都是x,y。所以我的问题是,这是设计吗?为什么没有记录?还是我错过了什么?
TIA!!
至少对于矩形,这是在(绘制矩形)[https://docs.microsoft.com/en-us/windows/win32/gdi/drawing-rectangles] 中记录的行为。此行为类似于线的工作方式(使用 LineTo 绘制),其中包含源点但不包含目标点。我不知道使用 SetWorldTransform 记录的更改是否会更改单条线的绘制方式。
我无法重现你的问题,请看下面的截图:
代码:
Graphics graphics(hdc);
SolidBrush solidBrush(Color(255, 255, 0, 0));
Point point1 = Point(0, 0);
Point point2 = Point(0, 10);
Point point3 = Point(10, 10);
Point point4 = Point(10, 0);
Point points[4] = {point1,point2,point3,point4};
graphics.FillPolygon(&solidBrush, points, 4);
如果你的代码有什么不同,请在问题中添加你的代码和截图。
更新:
我添加了一个新的截图来研究这个问题:
如果区域在 0 / 10 (1-9) 内,则 width/height 应为 9,如果包含给定 0 / 10 (0-10) 的 x,y 点,则应为 11。
不,宽度和高度应为 10 像素。如果你的意思是 DrawRectangle
,区域应该是 9x9 像素,不包括 1 像素笔。
如果使用Rectangle
,区域应为 8x8 像素,不包括 1 像素笔。
测试代码:
Pen blackPen(Color(255, 0, 0, 0), 1); //1 pixel
g->DrawRectangle(&blackPen, 0, 24, 10, 10); //10x10
Rectangle(hdc, 0, 36, 10, 46); // 10x10
RECT rect;
rect.left = 0;
rect.top = 12;
rect.right = 10;
rect.bottom = 22;
FillRect(hdc, &rect, (HBRUSH)(COLOR_WINDOW + 3)); //10x10