Подтвердить что ты не робот

Как рисовать округленный прямоугольник с помощью WinForms (.NET)?

Нарисуйте прямоугольник с помощью С#, и мне нужно нарисовать дугу во всех ребрах, в первую очередь я рисую прямоугольник, а затем мне нужна кнопка щелчка, она будет рисовать дугу по краям, как я могу это сделать?

4b9b3361

Ответ 1

Графический класс на С# не имеет встроенного метода для рисования округленных прямоугольников, однако есть несколько способов, которыми вы можете добиться этого эффекта. Ссылки в ответе Jay Riggs предлагают хорошие предложения о том, с чего начать, кроме того, я предлагаю вам ознакомиться с этой статьей:

С# - Создание округлых прямоугольников с использованием графического пути

Итак, сначала создадим GraphicsPath, и затем мы вызываем StartFigure так, чтобы мы можем начать добавлять ребра к пути. Остальная часть этого кода предназначена для верхнего левый угол и верхняя строка прямоугольник с закругленными углами. Если мы предполагаем чтобы округлить этот угол, добавим arc - в противном случае...

Ответ 3

Я знаю, что это сообщение устарело, но это самый лучший удар при поиске, как делать округленные прямоугольники на С#, и у меня были некоторые проблемы с ним. Метод AddArc является неточным и, таким образом, если вы используете код из принятого ответа, вы получите напуганный округленный прямоугольник. Верхний левый угол правильный, верхний правый и нижний левый деформированы, а нижний правый слишком мал. Я скорректировал некоторые вещи в коде, чтобы компенсировать неточности AddArc, и я считаю, что у меня есть рабочее решение для создания правильного закругленного прямоугольника. Эта версия также может разделять прямоугольник на секции верхнего левого и нижнего правого полушария, которые удобны для создания темного/темного оттенка для эффекта 3d.

Пример использования для настройки области окна, а также создания путей для увеличения/уменьшения по прямой для отслеживания с помощью светлых и темных ручек для затенения:

        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);

И, наконец, код:

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); }

}

}

Ответ 4

Сначала нарисуйте четыре линии и нарисуйте дуги в 4 углах.

Ответ 5

Все вышеописанное работает для рисования, но если вы хотите преобразовать свой графический путь в область custom control, я думаю, вы должны использовать функцию CreateRoundRectRgn (из gdi32) для правильной кривой для верхний правый, нижний левый и нижний правые края (верхний левый край рисуется правильно в соответствии с радиусом). Кратко посмотрите на http://pages.citebite.com/e1u2t5b7t4bih (сайт из экземпляра ответа).

Ответ 6

Используйте свойство LineJoin для Pen

Pen myPen = new Pen(Brushes.Black);

myPen.Width = 8.0f;

// Set the LineJoin property
myPen.LineJoin = System.Drawing.Drawing2D.LineJoin.Round;

// Draw the rectangle
e.Graphics.DrawRectangle(myPen, new Rectangle(50, 50, 200, 200));