2017-07-06 6 views
0

Ich habe ein Steuerelement erstellt, um einen kreisförmigen Fortschrittsbalken anzuzeigen. Die Steuerung ist unten dargestellt:DrawArc schließt keine Kanten

enter image description here

  • Die Steuerung arbeitet mit 2 ARC:
  • Einer von ihnen zeigt den aktuellen Wert (blau gefärbt)
  • Die andere zeigt die verbleibende Wert (rot gefärbt).

Beide funktioniert mit ProgressPen und DrawArc aus der Grafikbibliothek.

Das Problem ist, dass, wie Sie sehen können, die Kanten von den beiden Bögen einige Pixel zwischen ihnen haben und sie wirklich nicht verbinden - obwohl der Winkel eine doppelte Zahl ist und genau um 360 Grad zu gewährleisten.

Im Bild oben ist blau 90,0 Grad und rot ist 270,0 Grad (die 25% innerhalb des Kreises ist nur ein Test der Schriftart).

Wie kann dieses Verhalten vermieden werden?

Die Routine ich beide Bögen zeichnen bin mit ist:

Private Sub UserControl1_Paint(sender As Object, e As PaintEventArgs) Handles Me.Paint 

    e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality 
    e.Graphics.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBicubic 
    e.Graphics.PixelOffsetMode = Drawing2D.PixelOffsetMode.HighQuality 

    e.Graphics.TextRenderingHint = Drawing.Text.TextRenderingHint.AntiAlias 

    e.Graphics.CompositingMode = Drawing2D.CompositingMode.SourceOver 
    e.Graphics.CompositingQuality = Drawing2D.CompositingQuality.HighQuality 


    Dim NewRect As Rectangle = New Rectangle(m_X + (20/2.0f), m_Y + (20/2.0f), m_Width - 20, m_Height - 20) 

    DrawProgress(e.Graphics, NewRect, m_Valor) 


End Sub 


Private Sub DrawProgress(g As Graphics, rect As Rectangle, percentage As integer) 

     Dim progressAngle As single = CSng(360.000F/100.000F * percentage) 
     Dim remainderAngle As single = 360.000F - progressAngle 
     'create pens to use for the arcs 

     Using progressPen As New Pen(m_Color, 20), remainderPen As New Pen(m_EmptyColor, 20) 
      g.DrawArc(progressPen, rect, -90.000F, progressAngle) 
      g.DrawArc(remainderPen, rect, progressAngle - 90.000F, remainderAngle) 
      progressPen.Dispose 
     End Using 

End Sub 

Was mache ich falsch?

Wie kann ich einen perfekten Kreis ohne den Leerraum zwischen ROTEN und BLAUEN Balken haben?

HINWEIS: Ich sehe, dass wenn die Balkenbreite 1 oder 2 ist, der Effekt nicht gesehen wird. Aber ich muss die Steuerung in der Lage zu arbeiten, auch wenn die Breite 20 oder mehr ist.

Vielen Dank für jede Hilfe

Antwort

0

Ich würde die blaue Farbe als einen vollständigen Kreis nur ziehen und den roten Bogen über sie überlagern.

+0

Es ist eine gültige Idee, aber dieses Steuerelement wird auch verwendet, um verringerte Werte anzuzeigen - und auf diese Weise weiß ich nicht, ob der DrawArc-Befehl umgekehrt (von Vollkreis zu weniger als 360 Grad ...) zeichnen wird –

+0

Wie auch immer, ich muss darüber nachdenken, dass ich Zeit verschwenden werde, um stattdessen einen ganzen Kreis zu zeichnen, um nur den notwendigen Bogen zu zeichnen. –

Verwandte Themen