2015-11-22 38 views
6

Tôi đang sử dụng mã này để tạo hình chữ nhật tròn. Nhưng nó chỉ vẽ góc trên bên trái và bên phải của rectanlge, nhiều hơn nó doest không hoàn thành hình chữ nhật ở phần dưới. Làm thế nào để làm cho nó đầy đủ và đầy. Tôi nên thay đổi những gì?Cách vẽ hình chữ nhật tròn trong 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; 
    } 

Trả lời

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

Và bạn có thể thực hiện hai phương pháp khuyến nông cho các loại Graphics để bạn có thể sử dụng chúng như những Draw...Fill... phương pháp hình vẽ thông thường.

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

Cảm ơn bạn đã làm việc tốt – phpnet

Các vấn đề liên quan