【问题标题】:MFC/GDI CRgn CreateEllipticRgn is two pixels short?MFC/GDI CRgn CreateEllipticRgn 短两个像素?
【发布时间】:2020-07-10 03:53:40
【问题描述】:

如果我这样做CRgn::CreateEllipticRgn(0, 0, 120, 120);,结果会在右侧和底部缩短两个像素。这是为什么?我想可能是因为一个区域在轮廓内而不是在轮廓上,但在这种情况下,它应该是整个圆圈周围的 1 个像素边框,而不是右侧和底部的 2 个像素边框。有什么想法吗?

TIA!!

【问题讨论】:

  • left 和 top 包含在 bounds 中,right 和 bottom 不包含。这样,长度(左右)和高度(底部)更容易预测和计算。 left=0 right=120 是 120 像素宽。 left=1 right=121 是 120 像素宽。这就是矩形在 Windows 中的工作方式。
  • 我知道 RECT 是这样做的,但由于它是 x2 和 y2,因此您希望包含这一点。测试 gdi+,它确实包括点(0,0 到 0,2),给出 3 个像素。我的主要问题是将 GDI 与 GDI+ 混合在一起,但事情并没有排成一行,我转向所有 GDI+,现在它排成一行。

标签: winapi mfc gdi


【解决方案1】:

用图片说明问题:

    //RECT
    hPen = CreatePen(PS_SOLID, 1, RGB(255, 100, 0));
    SelectObject(hdc, hPen);
    Rectangle(hdc, 10, 10, 130, 130);
    //Ellipse
    hBrush = CreateSolidBrush(RGB(255, 0, 0));
    HRGN hTemp = CreateEllipticRgn(10, 10, 130, 130);
    FrameRgn(hdc, hTemp, hBrush, 1, 1);

来自Rectangle function,指出:

绘制的矩形不包括底部和右侧边缘。

如果使用 PS_NULL 笔,矩形的尺寸为 1 像素 高度减少,宽度减少 1 个像素。

来自CreateEllipticRgn,指出:

边界矩形定义了对象的大小、形状和方向 region: 矩形的长边定义了矩形的长度 椭圆的长轴;短边定义的长度 椭圆的短轴; 并且矩形的中心定义了 长轴和短轴的交点。

从测试结果来看,椭圆的长宽不包括底边和右边。

【讨论】:

  • 因为FrameRgn() 说它位于区域的外部(这就是我阅读“处理要包含在边框中的区域”的方式),意味着实际区域区域在轮廓内并且x2 和 y2 被视为与 RECT 相同(需要 +1)。如果想要使区域本身成为精确区域 (x1, y1) (x2, y2),则应使用 (x1-1), (y1-1) 和 (x2+2), (y2+2)。而 GDI+ x2 和 y2 不需要 +1。谢谢!!
猜你喜欢
  • 2011-08-06
  • 2018-12-13
  • 1970-01-01
  • 2019-06-15
  • 2011-04-22
  • 2013-11-26
  • 1970-01-01
  • 1970-01-01
  • 2012-02-20
相关资源
最近更新 更多