简体   繁体   English

GraphicsPath.AddArc 给出了错误的角度

[英]GraphicsPath.AddArc gives the wrong angle

I'm running into the problem that my rounded corners method returns non-uniform corners.我遇到了圆角方法返回不均匀角的问题。
Method:方法:

GraphicsPath GetRoundedPath(Rectangle r, int radius, bool topRight = true, bool topLeft = true, bool bottomLeft = true, bool bottomRight = true)
{
    GraphicsPath path = new GraphicsPath();

    if (topLeft)
        path.AddArc(r.X, r.Y, radius, radius, 180, 90);
    else path.AddLine(r.X, r.Y, r.Right, r.Y);

    if (topRight)
        path.AddArc(r.Right - radius, r.Y, radius, radius, 270, 90);
    else path.AddLine(r.Right, r.Y, r.Right, r.Height);

    if (bottomRight)
        path.AddArc(r.Right - radius, r.Bottom - radius, radius, radius, 0, 90);
    else path.AddLine(r.Right, r.Bottom, r.Right, r.Height);

    if (bottomLeft)
        path.AddArc(r.X, r.Bottom - radius, radius, radius, 90, 90);
    else path.AddLine(r.X, r.Bottom, r.X, r.Y);

    return path;
}

When invoke:调用时:

Panel p = new Panel();
p.BackColor = Color.Red;
p.Size = new Size(200, 200);
Controls.Add(p);
p.Region = new Region(GetRoundedPath(new Rectangle(p.ClientRectangle, 30, true, true, true, true));
p.Location = new Point(200, 200);

Return:返回:
在此处输入图像描述
It is noticeable that the upper left corner is drawn normally, the upper right and lower left are crooked, and the lower left is even crooked.可以看到,左上角绘制正常,右上角和左下角画歪了,左下角甚至歪了。

After, I noticed that exactly one pixel was not visible on the right and bottom, then I opened the Paint(program) and painted it myself and got even corners:之后,我注意到右边和底部恰好有一个像素不可见,然后我打开 Paint(program) 自己画了它,得到了均匀的角:
在此处输入图像描述

What I tried:我尝试了什么:
Passed less Rectangle to GetRoundedPath将较少的矩形传递给 GetRoundedPath
GetRoundedPath(new Rectangle(p.ClientRectangle.X, p.ClientRectangle.Y, p.ClientRectangle.Width - 1, p.ClientRectangle.Height - 1), 30, true, true, true, true)
The control just became a pixel smaller in width and height.控件只是在宽度和高度上变小了一个像素。
Don't to change Control.Region, to use Graphics.FillPath instead不要更改 Control.Region,而是使用 Graphics.FillPath

p.Paint += (s, e) =>
{
    e.Graphics.FillPath(Brushes.Red, GetRoundedPath(p.ClientRectangle, 30, true, true, true, true));
};

Nothing has changed, I also tried to use it in conjunction with the first什么都没有改变,我也尝试将它与第一个结合使用
Increase radius for individual corners增加单个角的半径

int oppositeRadius = (int)Math.Round(radius * 1.5)
...

The corners became stretched and looked more like slanted lines角变长,看起来更像斜线

It looks like off by 1 pixel for center of arc error.对于圆弧中心误差,它看起来像是偏离了 1 个像素。 Maybe try something like:也许尝试这样的事情:

GraphicsPath GetRoundedPath(Rectangle r, int radius, bool topRight = true, bool topLeft = true, bool bottomLeft = true, bool bottomRight = true)
{
    GraphicsPath path = new GraphicsPath();

    if (topLeft)
        path.AddArc(r.X, r.Y, radius, radius, 180, 90);
    else path.AddLine(r.X, r.Y, r.Right, r.Y);

    if (topRight)
        path.AddArc(r.Right - radius - 1, r.Y, radius, radius, 270, 90);
    else path.AddLine(r.Right, r.Y, r.Right, r.Height);

    if (bottomRight)
        path.AddArc(r.Right - radius - 1, r.Bottom - radius - 1, radius, radius, 0, 90);
    else path.AddLine(r.Right, r.Bottom, r.Right, r.Height);

    if (bottomLeft)
        path.AddArc(r.X, r.Bottom - radius - 1, radius, radius, 90, 90);
    else path.AddLine(r.X, r.Bottom, r.X, r.Y);

    return path;
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM