如何在 WinForm 中使用 GraphicsPath 绘制圆形进度条饼图?

How to draw a circular progressbar pie using GraphicsPath in WinForm?

我想要 WinForm 中的自定义循环进度条。但结果并不符合我的想法。我怎样才能画出和这张图一样的形状?我上传了两张图片以清楚我的问题。

我的代码:

void Form1_Paint(object sender, PaintEventArgs e)
    {
        int angle = 120;

        e.Graphics.SmoothingMode = SmoothingMode.HighQuality;

        Rectangle outerRect = new Rectangle(50, 50, 100, 100);
        Rectangle innerRect = new Rectangle(70, 70, 60, 60);

        int innerRadius = innerRect.Width / 2;
        int outerRadius = outerRect.Width / 2;

        Point innerCenter = new Point(innerRect.X + innerRadius, innerRect.Y + innerRadius);
        Point outerCenter = new Point(outerRect.X + outerRadius, outerRect.Y + outerRadius);

        GraphicsPath outerCircle = new GraphicsPath();
        outerCircle.AddEllipse(outerRect);

        GraphicsPath innerCircle = new GraphicsPath();
        innerCircle.AddEllipse(innerRect);

        GraphicsPath progPath = new GraphicsPath();

        Point p1 = new Point(outerRect.X + outerRadius, outerRect.Y);
        Point p2 = new Point(innerRect.X + innerRadius, innerRect.Y);


        Point inner = new Point((int)(innerRadius * Math.Cos(angle * Math.PI / 180) + innerCenter.X),
                                (int)(innerRadius * Math.Sin(angle * Math.PI / 180) + innerCenter.Y));
        Point outer = new Point((int)(outerRadius * Math.Cos(angle * Math.PI / 180) + outerCenter.X),
                                (int)(outerRadius * Math.Sin(angle * Math.PI / 180) + outerCenter.Y));

        progPath.AddLine(p1, p2);
        progPath.AddArc(innerRect, -90, angle);
        progPath.AddLine(inner, outer);
        progPath.AddArc(outerRect, angle - 90,-angle);

        progPath.Widen(Pens.Black);
        e.Graphics.DrawPath(Pens.Black, progPath);

    }

您可以创建一个 GraphicsPath, then add 2 arcs to the path using AddArc 方法:

  • 起始角 270 和扫描角 120 度的外弧。
  • 相反方向的内弧,起始角270 + 120和后掠角-120
  • 然后使用GraphicsPath.CloseFigure关闭路径。

这样你将有一个粗圆弧作为路径。

您可以使用 Graphics.FillPath method. And also you can draw the borders using GraphicsPath.DrawPath 方法填写路径。

结果

代码

private void Form1_Paint(object sender, PaintEventArgs e)
{
    var g = e.Graphics;
    g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;

    var center = new Point(100, 100);
    var innerR = 30;
    var thickness = 20;
    var startAngle = 270;
    var arcLength = 120;
    var outerR = innerR + thickness;
    var outerRect = new Rectangle
                    (center.X - outerR, center.Y - outerR, 2 * outerR, 2 * outerR);
    var innerRect = new Rectangle
                    (center.X - innerR, center.Y - innerR, 2 * innerR, 2 * innerR);

    using (var p = new GraphicsPath())
    {
        p.AddArc(outerRect, startAngle, arcLength);
        p.AddArc(innerRect, startAngle + arcLength, -arcLength);
        p.CloseFigure();
        e.Graphics.FillPath(Brushes.Green, p);
        e.Graphics.DrawPath(Pens.Black, p);
    }
}