반응형

라운드된 외곽선이 있는 패널 컨트롤
- 외곽선 두께/색상 지정 가능
- 코너 라운드 값 지정 가능
- 배경색 지정 가능
RoundBorderPanel.cs
using System; using System.Drawing; using System.Drawing.Drawing2D; using System.Windows.Forms; namespace SrcTree { public class RoundBorderPanel : Panel { public int padding = 5; public int radius = 10; public bool isBorder = true; public Color borderColor = Color.FromArgb(128, 51, 94, 129); public int borderWidth = 5; public bool isFill = false; public Color fillColor = Color.FromArgb(128, 243, 246, 251); public RoundBorderPanel() { } protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); Graphics g = e.Graphics; g.SmoothingMode = SmoothingMode.AntiAlias; if(isFill) { g.FillRoundedRectangle(new SolidBrush(fillColor), padding, padding, this.Width - padding * 2, this.Height - padding * 2, radius); } if(isBorder) { g.DrawRoundedRectangle(new Pen(borderColor, borderWidth), padding, padding, this.Width - padding * 2, this.Height - padding * 2, radius); } } //패널윈도우에 투명속성 추가 const int WS_EX_TRANSPARENT = 0x20; protected override CreateParams CreateParams { get { var cp = base.CreateParams; cp.ExStyle |= WS_EX_TRANSPARENT; return cp; } } } static class GraphicsExtension { private static GraphicsPath GenerateRoundedRectangle( this Graphics graphics, RectangleF rectangle, float radius) { float diameter; GraphicsPath path = new GraphicsPath(); if (radius <= 0.0F) { path.AddRectangle(rectangle); path.CloseFigure(); return path; } else { if (radius >= (Math.Min(rectangle.Width, rectangle.Height)) / 2.0) return graphics.GenerateCapsule(rectangle); diameter = radius * 2.0F; SizeF sizeF = new SizeF(diameter, diameter); RectangleF arc = new RectangleF(rectangle.Location, sizeF); path.AddArc(arc, 180, 90); arc.X = rectangle.Right - diameter; path.AddArc(arc, 270, 90); arc.Y = rectangle.Bottom - diameter; path.AddArc(arc, 0, 90); arc.X = rectangle.Left; path.AddArc(arc, 90, 90); path.CloseFigure(); } return path; } private static GraphicsPath GenerateCapsule( this Graphics graphics, RectangleF baseRect) { float diameter; RectangleF arc; GraphicsPath path = new GraphicsPath(); try { if (baseRect.Width > baseRect.Height) { diameter = baseRect.Height; SizeF sizeF = new SizeF(diameter, diameter); arc = new RectangleF(baseRect.Location, sizeF); path.AddArc(arc, 90, 180); arc.X = baseRect.Right - diameter; path.AddArc(arc, 270, 180); } else if (baseRect.Width < baseRect.Height) { diameter = baseRect.Width; SizeF sizeF = new SizeF(diameter, diameter); arc = new RectangleF(baseRect.Location, sizeF); path.AddArc(arc, 180, 180); arc.Y = baseRect.Bottom - diameter; path.AddArc(arc, 0, 180); } else path.AddEllipse(baseRect); } catch { path.AddEllipse(baseRect); } finally { path.CloseFigure(); } return path; } public static void DrawRoundedRectangle( this Graphics graphics, Pen pen, float x, float y, float width, float height, float radius) { RectangleF rectangle = new RectangleF(x, y, width, height); GraphicsPath path = graphics.GenerateRoundedRectangle(rectangle, radius); SmoothingMode old = graphics.SmoothingMode; graphics.SmoothingMode = SmoothingMode.AntiAlias; graphics.DrawPath(pen, path); graphics.SmoothingMode = old; } public static void DrawRoundedRectangle( this Graphics graphics, Pen pen, int x, int y, int width, int height, int radius) { graphics.DrawRoundedRectangle( pen, Convert.ToSingle(x), Convert.ToSingle(y), Convert.ToSingle(width), Convert.ToSingle(height), Convert.ToSingle(radius)); } public static void FillRoundedRectangle( this Graphics graphics, Brush brush, float x, float y, float width, float height, float radius) { RectangleF rectangle = new RectangleF(x, y, width, height); GraphicsPath path = graphics.GenerateRoundedRectangle(rectangle, radius); SmoothingMode old = graphics.SmoothingMode; graphics.SmoothingMode = SmoothingMode.AntiAlias; graphics.FillPath(brush, path); graphics.SmoothingMode = old; } public static void FillRoundedRectangle( this Graphics graphics, Brush brush, int x, int y, int width, int height, int radius) { graphics.FillRoundedRectangle( brush, Convert.ToSingle(x), Convert.ToSingle(y), Convert.ToSingle(width), Convert.ToSingle(height), Convert.ToSingle(radius)); } } }
사용
panel1.isBorder = true; panel1.isFill = true; panel1.radius = 5; panel1.borderWidth = 5; panel1.borderColor = Color.Red; panel1.fillColor = Color.Yellow; panel2.isBorder = true; panel2.isFill = false; panel2.radius = 10; panel2.borderWidth = 10; panel2.borderColor = Color.Green; panel3.isBorder = false; panel3.isFill = true; panel3.radius = 30; panel3.fillColor = Color.LightCoral; panel4.isBorder = true; panel4.isFill = true; panel4.radius = panel4.Width / 2; panel4.borderWidth = 5; panel4.borderColor = Color.DarkBlue; panel4.fillColor = Color.LightBlue;
프로젝트 소스 다운↓↓↓
RoundBorderPanel.zip
0.03MB
반응형
'윈폼(Winform)' 카테고리의 다른 글
C# 줄바꿈 자동 서식 변경(중괄호 {} 사용시) (0) | 2021.11.18 |
---|---|
C# WinForm 화면 깜빡임 방지 (1) | 2021.11.18 |
C# 부모 윈도우의 중앙에 메세지박스 띄우기 (0) | 2021.11.18 |
C# DataTable DataRow 데이터 가져오기 (1) | 2021.11.18 |
C# DataBase(Mysql, Maria) 접속, Select/Execute Query (0) | 2021.11.18 |
최근댓글