2015-11-22 30 views
6

このコードを使用して丸い四角形を作成しています。しかし、それはrectanlgeの左上と右の角だけを描画します、もっと下の部分で四角形を完成させません。それを完成させ充実させる方法。私は何を変えるべきですか?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; 
    } 

答えて

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

そして、あなたはいつものDraw...Fill...形状描画メソッドとしてそれらを使用することができますので、あなたはGraphicsタイプ用の2つの拡張メソッドを作ることができます。

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

ありがとうございました – phpnet

関連する問題