강좌와 팁

C#으로 모서리가 둥근 사각형 그리기 날짜:2020-7-23 10:29:00 조회수:142
작성자 : daypark
포인트 : 95
가입일 : 2020-02-14 10:42:05
방문횟수 : 29
글 14개, 댓글 12개
소개 : 자기소개를 입력하십시오.
작성글 보기
쪽지 보내기
최신 언어라는 C#에는 RoundRect가 없습니다.
왜 없는지 도무지 이해가 잘 안되는데 아무튼 없습니다.
그래서 만들어 써야 하는데 다행히 검색해 보면 이미 잘 만들어진 함수가 있지요.
다음은 스택 오버플로우에서 찾은건데 원래 확장 함수로 되어 있지만 간단한 테스트용으로 쓸 수 있도록 일반 함수로 형태를 약간 바꾸었습니다.

private void Form1_Paint(object sender, PaintEventArgs e)
{
    FillRoundedRectangle(e.Graphics, new SolidBrush(Color.Yellow), new Rectangle(10, 10, 300, 200), 15);
    DrawRoundedRectangle(e.Graphics, new Pen(Color.Red, 5), new Rectangle(10, 10, 300, 200), 15);
}

public GraphicsPath RoundedRect(Rectangle bounds, int radius)
{
    int diameter = radius * 2;
    Size size = new Size(diameter, diameter);
    Rectangle arc = new Rectangle(bounds.Location, size);
    GraphicsPath path = new GraphicsPath();

    if (radius == 0)
    {
        path.AddRectangle(bounds);
        return path;
    }

    // top left arc 
    path.AddArc(arc, 180, 90);

    // top right arc 
    arc.X = bounds.Right - diameter;
    path.AddArc(arc, 270, 90);

    // bottom right arc 
    arc.Y = bounds.Bottom - diameter;
    path.AddArc(arc, 0, 90);

    // bottom left arc
    arc.X = bounds.Left;
    path.AddArc(arc, 90, 90);

    path.CloseFigure();
    return path;
}

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

    using (GraphicsPath path = RoundedRect(bounds, cornerRadius))
    {
        graphics.DrawPath(pen, path);
    }
}

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

    using (GraphicsPath path = RoundedRect(bounds, cornerRadius))
    {
        graphics.FillPath(brush, path);
    }
}

세 메서드를 쓰고자 하는 클래스에 붙이고요 Paint 이벤트에서 호출만 하면 됩니다.
외곽선만 그릴 때는 Draw를 호출하고 내부를 채울 때는 Fill을 호출합니다.
둘 다 호출할 때는 Fill 먼저 호출하고 Draw를 호출하는 것이 좋습니다.
300, 200 크기로 모서리 반지름이 15인 둥근 사각형을 그렸습니다.



C#의 패스 기능이 잘 구비되어 있어 이 정도는 아주 쉽지요.
출력 모양도 깔끔하게 잘 나옵니다.
 

목록보기 삭제 수정 신고 스크랩


로그인하셔야 댓글을 달 수 있습니다.