首页 > 解决方案 > GDI+ FillPolygon 包括左侧和顶部轮廓?

问题描述

我使用 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。所以我的问题是,这是设计吗?为什么不记录?还是我错过了什么?

蒂亚!!

标签: winapigdi+

解决方案


我无法重现你的问题,请看下面的截图:

在此处输入图像描述

代码:

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);

如果您的代码有任何差异,请在问题中添加您的代码和屏幕截图。

更新:

我添加了一个新的屏幕快照来研究这个问题:

2

如果区域在 0 / 10 (1-9) 内,则宽度/高度应为 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

推荐阅读