How to create a rounded rectangle at runtime on Windows Forms using VB.NET/C#?

I would like to create a filled rounded rectangle at runtime and assign it as the contents of the PictureBox (already created and hidden) in Windows Forms.

Do you have an idea how to implement it?

+5
source share
3 answers

This method fills a rounded rectangle on a graphic object (VB code):

Public Sub FillRoundedRectangle(ByVal g As Drawing.Graphics, ByVal r As Rectangle, ByVal d As Integer, ByVal b As Brush)
    Dim mode As Drawing2D.SmoothingMode = g.SmoothingMode
    g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighSpeed
    g.FillPie(b, r.X, r.Y, d, d, 180, 90)
    g.FillPie(b, r.X + r.Width - d, r.Y, d, d, 270, 90)
    g.FillPie(b, r.X, r.Y + r.Height - d, d, d, 90, 90)
    g.FillPie(b, r.X + r.Width - d, r.Y + r.Height - d, d, d, 0, 90)
    g.FillRectangle(b, CInt(r.X + d / 2), r.Y, r.Width - d, CInt(d / 2))
    g.FillRectangle(b, r.X, CInt(r.Y + d / 2), r.Width, CInt(r.Height - d))
    g.FillRectangle(b, CInt(r.X + d / 2), CInt(r.Y + r.Height - d / 2), CInt(r.Width - d), CInt(d / 2))
    g.SmoothingMode = mode
End Sub

To call this function, handle the drawing event in the image window and pass the e.Graphics object as the first argument, and the image frame is limited to the second argument if you want the rectangle to completely fill your image.

d , 30, ...

, ( ) :

Public Sub DrawRoundedRectangle(ByVal g As Drawing.Graphics, ByVal r As Rectangle, ByVal d As Integer, ByVal p As Pen)
    g.DrawArc(p, r.X, r.Y, d, d, 180, 90)
    g.DrawLine(p, CInt(r.X + d / 2), r.Y, CInt(r.X + r.Width - d / 2), r.Y)
    g.DrawArc(p, r.X + r.Width - d, r.Y, d, d, 270, 90)
    g.DrawLine(p, r.X, CInt(r.Y + d / 2), r.X, CInt(r.Y + r.Height - d / 2))
    g.DrawLine(p, CInt(r.X + r.Width), CInt(r.Y + d / 2), CInt(r.X + r.Width), CInt(r.Y + r.Height - d / 2))
    g.DrawLine(p, CInt(r.X + d / 2), CInt(r.Y + r.Height), CInt(r.X + r.Width - d / 2), CInt(r.Y + r.Height))
    g.DrawArc(p, r.X, r.Y + r.Height - d, d, d, 90, 90)
    g.DrawArc(p, r.X + r.Width - d, r.Y + r.Height - d, d, d, 0, 90)
End Sub
+8

, , / . , GraphicsPath, , , :

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

    SmoothingMode mode = graphics.SmoothingMode;
    graphics.SmoothingMode = SmoothingMode.AntiAlias;

    using (GraphicsPath path = RoundedRectangle(rectangle, radius))
    {
        graphics.FillPath(brush, path);
    }
    graphics.SmoothingMode = mode;
}

public static GraphicsPath RoundedRectangle(Rectangle r, int radius)
{
    GraphicsPath path = new GraphicsPath();
    int d = radius * 2;

    path.AddLine(r.Left + d, r.Top, r.Right - d, r.Top);
    path.AddArc(Rectangle.FromLTRB(r.Right - d, r.Top, r.Right, r.Top + d), -90, 90);
    path.AddLine(r.Right, r.Top + d, r.Right, r.Bottom - d);
    path.AddArc(Rectangle.FromLTRB(r.Right - d, r.Bottom - d, r.Right, r.Bottom), 0, 90);
    path.AddLine(r.Right - d, r.Bottom, r.Left + d, r.Bottom);
    path.AddArc(Rectangle.FromLTRB(r.Left, r.Bottom - d, r.Left + d, r.Bottom), 90, 90);
    path.AddLine(r.Left, r.Bottom - d, r.Left, r.Top + d);
    path.AddArc(Rectangle.FromLTRB(r.Left, r.Top, r.Left + d, r.Top + d), 180, 90);
    path.CloseFigure();
    return path;
}

Draw only (not fill), :

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

    SmoothingMode mode = graphics.SmoothingMode;
    graphics.SmoothingMode = SmoothingMode.AntiAlias;

    using (GraphicsPath path = RoundedRectangle(rectangle, radius))
    {
        graphics.DrawPath(pen, path);
    }
    graphics.SmoothingMode = mode;
}
+13

- Bitmap " " Graphics. DrawEllipse .

PictureBox.

0

All Articles