반응형
라운드된 외곽선이 있는 패널 컨트롤
- 외곽선 두께/색상 지정 가능
- 코너 라운드 값 지정 가능
- 배경색 지정 가능
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;
프로젝트 소스 다운↓↓↓
반응형
'윈폼(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 |
최근댓글