【问题标题】:GDI+ FillPolygon includes the left and top outline?GDI+ FillPolygon 包括左侧和顶部轮廓?
【发布时间】:2020-05-08 11:28:49
【问题描述】:

我使用 GDI+ FillPolygon()function 创建了一个梯形,但发现它的右侧和底部相差 1 个像素。我假设你传入了要填充的区域的点,但更仔细地阅读它说它填充了多边形的内部,如果这样做的话。我实际发现的是填充函数包括左和上(x,y)但不包括右和下(x,y)。为了简单起见,就矩形而言,填充(0,0)-(10,10)时,填充区域为(0,0)-(9,9)。我希望它是(0,0)-(10,10)或(1,1)-(9,9)。毕竟,给出的点都是x,y。所以我的问题是,这是设计吗?为什么不记录?还是我错过了什么?

TIA!!

【问题讨论】:

    标签: winapi gdi+


    【解决方案1】:

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

    代码:

    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) 之内,则宽度/高度应为 9,如果包含 x、y 点,则宽度/高度应为 11(给定 0 / 10 (0-10))。

    不,宽度和高度应为 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
    

    【讨论】:

    • 如果区域在 0 / 10 (1-9) 之内,则宽度/高度应为 9,如果包含给定 0 / 10 (0-10) 的 x、y 点,则宽度/高度应为 11。因为处理 x,y (我知道 RECT 和一些 GDI 项目通过一件事完成,但我用 GDI+ 完成的其他测试没有它(因为它处理 x,y、宽度、高度, 但似乎所有 x,y) 都可以填充?我猜这只是 GDI 和 GDI+ 的 Windows 图形 API。谢谢。
    • 图片帮助。 MS/Windows 和其他基于图形和字符的框架在其他环境(例如 DOS)中工作的方式的语义在处理 X、Y 的终点(右下)方面是不同的。在右下角的那些 X,Y 中是结束点(X,Y 处的像素被填充并在那里结束)。 Windows 中的许多 rect 样式以 X-1、Y-1 结尾(我确信速度是最初完成的主要原因,因此宽度/高度的计算速度比必须调整 1 更快)。
    【解决方案2】:

    至少对于矩形,这是在 (Drawing Rectangles)[https://docs.microsoft.com/en-us/windows/win32/gdi/drawing-rectangles].此行为类似于包含源点但不包括目标点的线的工作方式(使用 LineTo 绘制)。我不知道使用 SetWorldTransform 记录的更改是否会更改单条线的绘制方式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-30
      • 1970-01-01
      • 2011-03-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多