Cómo dibujar un rectángulo redondeado con WinForms (.NET)?

Dibuje un rectángulo usando C # y necesito dibujar el arco en cada borde. Primero dibujaré un rectángulo y luego necesito el botón de hacer clic para dibujar el arco en los bordes, ¿cómo puedo hacerlo?

La clase de gráficos en C # no tiene un método incorporado para dibujar rectangularjs redondeados, sin embargo, hay varias formas en que puede lograr este efecto. Los enlaces en la respuesta de Jay Riggs ofrecen buenas sugerencias sobre dónde comenzar, adicionalmente sugiero que consulte este artículo:

C # – Creando rectangularjs redondeados usando una ruta de gráficos

Entonces, primero creamos un GraphicsPath y luego llamamos a StartFigure para que podamos comenzar a agregar bordes a la ruta. El rest de este código es para la esquina superior izquierda y la línea superior del rectángulo redondeado. Si se supone que debemos redondear esta esquina, agregamos un arco, de lo contrario …

Dibuja un rectángulo con esquinas redondeadas?

Tratar:

Gráficos extendidos: rectangularjs redondeados, métricas de fonts y más para C # 3.0
Gráficos extendidos: una implementación de rectángulo redondeado en C #

Sé que esta publicación es antigua, pero es la mejor opción cuando busco cómo hacer rectangularjs redondeados en C # y he tenido algunos problemas con ella. El método AddArc es inexacto y, como tal, si utiliza el código de la respuesta aceptada obtendrá un rectángulo redondeado funky. La esquina superior izquierda es correcta, la parte superior derecha e inferior izquierda están deformes, y la inferior derecha es demasiado pequeña. He ajustado algunas cosas en el código para compensar las imprecisiones de AddArc y creo que tengo una solución de trabajo para crear un rectángulo redondeado correcto. Esta versión también puede separar el rectángulo en secciones de la mitad superior izquierda y la mitad inferior derecha que es útil para hacer sombreado claro / oscuro para efecto 3D.

Ejemplo de uso para establecer una región de ventana y también crear trayectos de topleft / bottomright para rastrear con plumas claras y oscuras para sombrear:

Region = new Region(RoundedRectangles.RoundedRectangle.Create(new Rectangle(0, 0, Size.Width, Size.Height), 8, RoundedRectangles.RoundedRectangle.RectangleCorners.TopRight | RoundedRectangles.RoundedRectangle.RectangleCorners.TopLeft)); TopLeftPath = RoundedRectangles.RoundedRectangle.Create(new Rectangle(0, 0, Size.Width, Size.Height), 8, RoundedRectangles.RoundedRectangle.RectangleCorners.TopRight | RoundedRectangles.RoundedRectangle.RectangleCorners.TopLeft, RoundedRectangles.RoundedRectangle.WhichHalf.TopLeft); BottomRightPath = RoundedRectangles.RoundedRectangle.Create(new Rectangle(0, 0, Size.Width-1, Size.Height-1), 8, RoundedRectangles.RoundedRectangle.RectangleCorners.TopRight | RoundedRectangles.RoundedRectangle.RectangleCorners.TopLeft, RoundedRectangles.RoundedRectangle.WhichHalf.BottomRight); 

Y finalmente el código:

 using System; using System.Drawing; using System.Drawing.Drawing2D; namespace RoundedRectangles { public abstract class RoundedRectangle { [Flags] public enum RectangleCorners { None = 0, TopLeft = 1, TopRight = 2, BottomLeft = 4, BottomRight = 8, All = TopLeft | TopRight | BottomLeft | BottomRight } public enum WhichHalf { TopLeft, BottomRight, Both } static void Corner(GraphicsPath path, int x1, int y1, int x2, int y2, int x3, int y3) { path.AddLine(x1, y1, x2, y2); path.AddLine(x2, y2, x3, y3); } public static GraphicsPath Create(int x, int y, int width, int height, int radius, RectangleCorners corners, WhichHalf half) { if (radius <= 0) { GraphicsPath rectp = new GraphicsPath(); rectp.AddRectangle(new Rectangle(x, y, width, height)); return rectp; } int dia = radius * 2; Rectangle TLarc = new Rectangle(x, y, dia, dia); Rectangle TRarc = new Rectangle(x + width - dia - 1, y, dia, dia); Rectangle BRarc = new Rectangle(x + width - dia - 1, y + height - dia - 1, dia, dia); Rectangle BLarc = new Rectangle(x, y + height - dia - 1, dia, dia); Rectangle TLsquare = new Rectangle(x, y, radius, radius); Rectangle TRsquare = new Rectangle(x + width - radius, y, radius, radius); Rectangle BRsquare = new Rectangle(x + width - radius, y + height - radius, radius, radius); Rectangle BLsquare = new Rectangle(x, y + height - radius, radius, radius); GraphicsPath p = new GraphicsPath(); p.StartFigure(); if (half == WhichHalf.Both || half == WhichHalf.TopLeft) { if (corners.HasFlag(RectangleCorners.BottomLeft)) p.AddArc(BLarc, 135, 45); else p.AddLine(BLsquare.Left, BLsquare.Bottom, BLsquare.Left, BLsquare.Top); p.AddLine(BLsquare.Left, BLsquare.Top - 1, TLsquare.Left, TLsquare.Bottom + 1); if (corners.HasFlag(RectangleCorners.TopLeft)) p.AddArc(TLarc, 180, 90); else Corner(p, TLsquare.Left, TLsquare.Bottom, TLsquare.Left, TLsquare.Top, TLsquare.Right, TLsquare.Top); p.AddLine(TLsquare.Right + 1, TLsquare.Top, TRsquare.Left - 1, TRsquare.Top); if (corners.HasFlag(RectangleCorners.TopRight)) p.AddArc(TRarc, -90, 45); } if (half == WhichHalf.Both || half == WhichHalf.BottomRight) { if (corners.HasFlag(RectangleCorners.TopRight)) p.AddArc(TRarc, -45, 45); else p.AddLine(TRsquare.Right, TRsquare.Top, TRsquare.Right, TRsquare.Bottom); p.AddLine(TRsquare.Right, TRsquare.Bottom + 1, BRsquare.Right, BRsquare.Top - 1); if (corners.HasFlag(RectangleCorners.BottomRight)) p.AddArc(BRarc, 0, 90); else Corner(p, BRsquare.Right, BRsquare.Top, BRsquare.Right, BRsquare.Bottom, BRsquare.Left, BRsquare.Bottom); p.AddLine(BRsquare.Left - 1, BRsquare.Bottom, BLsquare.Right + 1, BLsquare.Bottom); if (corners.HasFlag(RectangleCorners.BottomLeft)) p.AddArc(BLarc, 90, 45); else p.AddLine(BLsquare.Right, BLsquare.Bottom, BLsquare.Left, BLsquare.Bottom); } return p; } public static GraphicsPath Create(Rectangle rect, int radius, RectangleCorners c, WhichHalf which_half) { return Create(rect.X, rect.Y, rect.Width, rect.Height, radius, c, which_half); } public static GraphicsPath Create(Rectangle rect, int radius, RectangleCorners c) { return Create(rect.X, rect.Y, rect.Width, rect.Height, radius, c, WhichHalf.Both); } public static GraphicsPath Create(Rectangle rect, int radius) { return Create(rect.X, rect.Y, rect.Width, rect.Height, radius, RectangleCorners.All, WhichHalf.Both); } } 

}

Todo lo anterior funciona para el dibujo, pero si desea convertir su ruta de gráficos a la región de control personalizado , creo que debería usar la función CreateRoundRectRgn (de gdi32) para la curva adecuada para los bordes superior derecho, inferior izquierdo e inferior derecho (borde superior izquierdo ha sido dibujado correctamente según el radio). Eche un vistazo rápido a http://pages.citebite.com/e1u2t5b7t4bih (sitio de la respuesta de instanceofTom)

Primero dibuja las cuatro líneas y dibuja arcos en las 4 esquinas.