2015-11-22 4 views
6

Ich verwende diesen Code, um ein abgerundetes Rechteck zu machen. Aber es zeichnet nur die oberen linken und rechten Ecken des Rechtecks, mehr nicht das Rechteck im unteren Teil. Wie man es vervollständigt und füllt. Welche Änderungen sollte ich vornehmen?Wie zeichne ich ein abgerundetes Rechteck in C#

public static Bitmap DrawRoundedRectangle(Bitmap Image, Color BoxColor, int XPosition, int YPosition, 
     int Height, int Width, int CornerRadius) 
    { 
    Bitmap NewBitmap = new Bitmap(Image, Image.Width, Image.Height); 
    using (Graphics NewGraphics = Graphics.FromImage(NewBitmap)) 
    { 
     using (Pen BoxPen = new Pen(BoxColor)) 
     { 
      using (GraphicsPath Path = new GraphicsPath()) 
      { 
        Path.AddLine(XPosition + CornerRadius, YPosition, XPosition + Width - (CornerRadius * 2), YPosition); 
        Path.AddArc(XPosition + Width - (CornerRadius * 2), YPosition, CornerRadius * 2, CornerRadius * 2, 270, 90); 
        Path.AddLine(XPosition + Width, YPosition + CornerRadius, XPosition + Width, YPosition + Height - (CornerRadius * 2)); 
        Path.AddArc(XPosition + Width - (CornerRadius * 2), YPosition + Height - (CornerRadius * 2), CornerRadius * 2, CornerRadius * 2, 0, 90); 
       Path.AddLine(XPosition + Width - (CornerRadius * 2), YPosition + Height, XPosition + CornerRadius, YPosition + Height); 
        Path.AddArc(XPosition, YPosition + Height - (CornerRadius * 2), CornerRadius * 2, CornerRadius * 2, 90, 90); 
        Path.AddLine(XPosition, YPosition + Height - (CornerRadius * 2), XPosition, YPosition + CornerRadius); 
        Path.AddArc(XPosition, YPosition, CornerRadius * 2, CornerRadius * 2, 180, 90); 
        Path.CloseFigure(); 
        NewGraphics.DrawPath(BoxPen, Path); 
       } 
       } 
      } 
     return NewBitmap; 
    } 

Antwort

17
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; 
    } 

Und Sie können zwei Erweiterungsmethoden für die Graphics Typ machen, damit Sie sie als die üblichen Draw... und Fill... Form Ziehverfahren verwenden können.

public static void DrawRoundedRectangle(this Graphics graphics, Pen pen, Rectangle bounds, int cornerRadius) 
    { 
     if (graphics == null) 
      throw new ArgumentNullException("graphics"); 
     if (pen == null) 
      throw new ArgumentNullException("pen"); 

     using (GraphicsPath path = RoundedRect(bounds, cornerRadius)) 
     { 
      graphics.DrawPath(pen, 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); 
     } 
    } 
+0

Danke funktioniert gut – phpnet