Рисование картинки Box C#

Я пытаюсь сделать настроенную картинку, которая выглядит так -

введите описание изображения здесь

Пока все, что я сделал, это - введите описание изображения здесь

используя этот код -

    protected void UpdateRegion()
    {
        var path = new GraphicsPath();
        Point[] points =
        {
            new Point( 0, 0),
            new Point(0, ClientSize.Height-80),
            new Point(80 , ClientSize.Height),
            new Point(ClientSize.Width-80, ClientSize.Height),
            new Point(ClientSize.Width,  ClientSize.Height-80),
            new Point(ClientSize.Width , 0)
        };
        path.AddPolygon(points);
        path.FillMode = FillMode.Winding;
        this.Region = new Region(path);
    }

1 ответ

Решение

Ну вот:

        GraphicsPath path = new GraphicsPath();
        path.FillMode = FillMode.Winding;

        int cut = 80;
        Rectangle cr = panel1.ClientRectangle;

        Point[] points =
        {
            new Point(0, cr.Height - cut),
            new Point(0, 0),
            new Point(cr.Width, 0),
            new Point(cr.Width, cr.Height - cut),
            new Point(cr.Width - cut, cr.Height),
            new Point(cut, cr.Height),
            new Point(0, cr.Height - cut),
        };
        path.AddPolygon(points);

        Rectangle arcRect = new Rectangle(0, cr.Height - 2 * cut, 2 * cut, 2 * cut);
        path.AddArc(arcRect, 90f, 90f);

Дуга определяется ограничивающим прямоугольником, который в нашем случае в два раза больше разреза. Он начинается под углом 90° по часовой стрелке от оси x и продолжается (как минимум) еще на 90°.

Вы можете добавить его в GraphicsPath или нарисовать его с помощью объекта Graphics.

Вот цитата из MSDN:

Если на рисунке есть предыдущие линии или кривые, добавляется линия, чтобы соединить конечную точку предыдущего сегмента с началом дуги.

Дуга проходит по периметру эллипса, ограниченного указанным прямоугольником. Начальная точка дуги определяется путем измерения по часовой стрелке от оси x эллипса (под углом 0 градусов) на количество градусов в начальном угле. Конечная точка аналогичным образом определяется путем измерения по часовой стрелке от начальной точки на количество градусов в углу развертки. Если угол развертки больше 360 градусов или меньше -360 градусов, то дуга отклоняется ровно на 360 градусов или -360 градусов соответственно.

Отмечу, что я добавил ограничивающий прямоугольник дуги только для демонстрации. Код не включает его.

Для округлых разрезов в других углах вам необходимо изменить и расширить массив точек и добавить дополнительные / другие дуги.

Другие угловые дуги принимают эти прямоугольники:

 Rectangle arcRectTL = new Rectangle(0, 0, 2 * cut, 2 * cut);
 Rectangle arcRectTR = new Rectangle(cr.Width - 2 * cut, 0, 2 * cut, 2 * cut);
 Rectangle arcRectBR = new Rectangle(cr.Width - 2*cut, cr.Height - 2*cut, 2*cut, 2*cut);

Начальные углы соответственно: 180°, 270° and 0°,

Размеры и угол наклона остаются неизменными.

Другие вопросы по тегам