[C#] Round Rectangle 처리하기
C# 2008. 8. 21. 17:04 |RoundPanel 클래스를 제작했습니다.
Panel을 상속해서 처리 했습니다.
Round 하는 코드는 아래의 코드를 참조 하시면 됩니다.
{
int diameter = 2 * radius;
Rectangle arcRect =
new Rectangle(rect.Location, new Size(diameter, diameter));
GraphicsPath path = new GraphicsPath();
path.AddArc(arcRect, 180, 90);
arcRect.X = rect.Right - diameter;
path.AddArc(arcRect, 270, 90);
arcRect.Y = rect.Bottom - diameter;
path.AddArc(arcRect, 0, 90);
arcRect.X = rect.Left;
path.AddArc(arcRect, 90, 90);
path.CloseFigure();
return path;
}
Panel 함수에서 드로잉 하는 코드 입니다.
{
RoundPanel panel = (RoundPanel)sender;
Graphics g = e.Graphics;
g.SmoothingMode = SmoothingMode.HighQuality;
int width = panel.ClientRectangle.Width;
int height = panel.ClientRectangle.Height;
Rectangle rect = new Rectangle(0, 0, width-1, height-1);
using (GraphicsPath path = RoundPanel.GetRoundedRectPath(rect, 8))
{
using (Brush brush = new LinearGradientBrush(
new Rectangle(0, 0, panel.ClientRectangle.Width, panel.ClientRectangle.Height),
Color.FromArgb(panel.Opcity, 102, 102, 102),
Color.FromArgb(panel.Opcity, 0, 0, 0),
90.0f))
{
//graphics.FillRectangle(brush, 0, 0, this.ClientRectangle.Width, this.ClientRectangle.Height);
g.FillPath(brush, path);
}
//g.FillPath(Brushes.Yellow, path);
Pen pen = new Pen(Color.FromArgb(panel.Opcity, 255, 255, 255));
g.DrawPath(pen, path);
}
}
이걸 처리 하다 보면 화면을 전환 하거나 리프레쉬할때 플리커 현상이 생기기도 합니다.
이걸 해결하기 위해서 RoundPanel에 더블버퍼링 처리 코드를 추가 했습니다.
{
...
this.SetStyle( ControlStyles.UserPaint |
ControlStyles.AllPaintingInWmPaint |
ControlStyles.DoubleBuffer, true);
}
실행 파일 :
.
관련 코드 :
.