2016-07-21 18 views
-1

Ich versuche gerade, ein gradient gefülltes abgerundetes Rechteck auf einem Panel bar in einem Formular zu zeichnen.C# - Ein abgerundetes Rechteck auf einem Panel zeichnen

Von einigen Recherchen fand ich einige Code, der mir ein eigenes Rechteck zu erstellen erlaubt:

static class CustomRectangle 
{ 
    public static GraphicsPath RoundedRect(Rectangle bounds, int radius) 
    { 
     int diameter = radius * 2; 
     Size size = new Size(diameter, diameter); 
     Rectangle arc = new Rectangle(bounds.Location, size); 
     GraphicsPath path = new GraphicsPath(); 

     if (radius == 0) 
     { 
      path.AddRectangle(bounds); 
      return path; 
     } 

     // top left arc 
     path.AddArc(arc, 180, 90); 

     // top right arc 
     arc.X = bounds.Right - diameter; 
     path.AddArc(arc, 270, 90); 

     // bottom right arc 
     arc.Y = bounds.Bottom - diameter; 
     path.AddArc(arc, 0, 90); 

     // bottom left arc 
     arc.X = bounds.Left; 
     path.AddArc(arc, 90, 90); 

     path.CloseFigure(); 
     return path; 
    } 

    public static void FillRoundedRectangle(this Graphics graphics, Brush brush, Rectangle bounds, int cornerRadius) 
    { 
     if (graphics == null) 
      throw new ArgumentNullException("graphics"); 
     if (brush == null) 
      throw new ArgumentNullException("brush"); 

     using (GraphicsPath path = RoundedRect(bounds, cornerRadius)) 
     { 
      graphics.FillPath(brush, path); 
     } 
    } 

Kredit dieser page

Weiter, um dieses benutzerdefinierte Rechteck mit, ich habe versucht, die paint Methode für die Verwendung von bar Panel.

private void quickMenuBar_Paint(object sender, PaintEventArgs e) 
    { 
     LinearGradientBrush myBrush = new LinearGradientBrush(new Point(20, 20), new Point(120, 520), Color.DarkBlue, Color.RoyalBlue); 
     System.Drawing.Graphics formGraphics = this.CreateGraphics(); 

     CustomRectangle.FillRoundedRectangle(formGraphics, myBrush, new System.Drawing.Rectangle(20, 20, 100, 500), 25); 
     myBrush.Dispose(); 
     formGraphics.Dispose(); 
} 

Aber nach diesem Code ausführen, druckt er nur ein abgerundetes Rechteck direkt auf die Form und hinter dem bar Panel.

Ich habe noch andere Methoden, die ein Panel mit einem Standard-Rechteck mit PaintEventArgs e füllen:

e.Graphics.FillRectangle(myBrush , otherBar.ClientRectangle); 

So offensichtlich muß ich verwende PaintEventArgs e in meiner benutzerdefinierten Rechteck-Methode, aber ich weiß nicht, wie oder wohin.

Wenn es bessere Möglichkeiten gibt, als diese Art, abgerundete Rectnagles zu zeichnen, bitte teilen.

+0

_System.Drawing.Graphics formGraphics = this.CreateGraphics(); _ Verwenden Sie niemals 'control.CreateGraphics'! Versuchen Sie niemals ein 'Graphics' Objekt zu cachen! Zeichnen Sie entweder mit einem 'Graphics g = Graphics.FromImage (bmp)' oder im 'Paint' -Ereignis eines Steuerelements in eine' Bitmap bmp' mit dem 'e.Graphics' -Parameter. – TaW

+0

Versuchen Sie, Grafiken für Panel zu verwenden, nicht für das Formular. –

Antwort

2

Normalerweise sollten Sie niemals CreateGraphics() verwenden. Entfernen Sie einfach die folgende Zeile:

System.Drawing.Graphics formGraphics = this.CreateGraphics(); 

Und e.Graphics verwenden, wo Sie vorher formGraphics verwenden würden. Das Paint Ereignis bittet Sie im Grunde, "etwas für mich zu malen, hier ist das Grafikobjekt, auf dem gemalt werden soll".

Da Sie Ihrer Methode mit abgerundeten Vierecken bereits eine Graphics Objektinstanz bereitstellen, sind dort keine Änderungen erforderlich.

Verwandte Themen