2016-03-19 7 views
2

Ich möchte meine benutzerdefinierte kreisförmige Fortschrittsanzeige in WinForm. Aber das Ergebnis passt nicht zu dem, was ich denke. Wie kann ich in diesem Bild die gleiche Form zeichnen? Ich habe zwei Bilder hochgeladen, um mein Problem zu verdeutlichen.Wie zeichne eine kreisförmige Fortschrittsbalken Torte mit GraphicsPath in WinForm?

Target shape

My code result

Mein Code, dies zu tun:

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

    } 

Antwort

4

Sie können eine GraphicsPath erstellen, fügen Sie dann 2 Bögen auf den Pfad mit AddArc Methode:

  • Äußerer Bogen vom Startwinkel 270 und Schwenkwinkel 120 Grad.
  • innerer Bogen in entgegengesetzter Richtung, von dem Startwinkel 270 + 120 und Pfeilungswinkel -120 Grad
  • dann den Pfad GraphicsPath.CloseFigure Verwendung schließen.

Auf diese Weise haben Sie einen dicken Bogen als Pfad.

Sie können den Pfad mit der Methode Graphics.FillPath füllen. Und Sie können auch die Grenzen mit der Methode GraphicsPath.drawPath zeichnen.

Ergebnis

enter image description here

-Code

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); 
    } 
} 
+0

Dank @Reza. Dieser Weg ist einfacher als meine Methode. –