Рисование внутреннего круга внутри метки Winform как можно большего размера в c # - PullRequest
0 голосов
/ 10 мая 2018

У меня есть ярлык WinForms, и я пытаюсь нарисовать внутренний круг (не заполненный) внутри ярлыка как можно большего размера.

Я испробовал два метода, один из которых был применен к label1, а другой - к двум label2. В обоих случаях это не работает.

Примечание. Ярлык должен сохранять цвет фона и содержание.

Как мне от этого избавиться?

Код:

void DrawCircle1(Graphics g, Point centerPos, int radius, int cutOutLen)
{
    RectangleF rectangle = new RectangleF(centerPos.X, centerPos.Y, 
        radius * 2,
        radius * 2
        );

    // calculate the start angle
    float startAngle = (float)(Math.Asin(
        1f * (radius - cutOutLen) / radius) / Math.PI * 180);

    using (System.Drawing.Drawing2D.GraphicsPath path = new System.Drawing.Drawing2D.GraphicsPath())
    {
        path.AddArc(rectangle, 180 - startAngle, 180 + 2 * startAngle);
        path.CloseFigure();

        //g.FillPath(Brushes.Yellow, path);
        using (Pen p = new Pen(Brushes.Yellow))
        {
            g.DrawPath(new Pen(Brushes.Blue, 2), path);
        }
    }
}

    private void DrawCircle2(PaintEventArgs e)
    {
        Label tempLabel = label2;

        using (System.Drawing.SolidBrush myBrush = new System.Drawing.SolidBrush(System.Drawing.Color.Red))
        {               
            using (System.Drawing.Pen myPen = new Pen(myBrush, 2))
            {
                e.Graphics.DrawEllipse(myPen, new System.Drawing.Rectangle(tempLabel.Location.X, tempLabel.Location.Y,
                    tempLabel.Width, tempLabel.Height));
            }
        }
    }

protected override void OnPaint(PaintEventArgs e)
{
    base.OnPaint(e);
    e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
    DrawCircle1(e.Graphics, new Point(label1.Width/2, label1.Height/2), 10, 50);
    DrawCircle2(e);
}

Ниже скриншота:

enter image description here

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

Те же процедуры, которые вы используете сейчас, вызывая их из события Paint() элемента управления.
То же самое, если вы создаете пользовательский элемент управления. В этом случае используйте переопределенное событие OnPaint().

В событии Paint() элемента управления вызовите один или несколько методов для рисования фигуры на поверхности элемента управления.

private void label1_Paint(object sender, PaintEventArgs e)
{
    DrawCircle1(e.Graphics, label1.ClientRectangle);
}

private void label2_Paint(object sender, PaintEventArgs e)
{
    DrawCircle2(e.Graphics, label2.ClientRectangle);
}

Используйте границы элемента управления ClientRectangle для получения размера фигуры.
Здесь ClientRectangle уменьшается на 1 при использовании Graphics.DrawEllipse() и на 2 при использовании Graphics.DrawPath(). Два метода рассчитывают размер пера относительно области рисования немного по-разному.

private void DrawCircle1(Graphics g, RectangleF DrawingArea)
{
    DrawingArea.Inflate(-2, -2);

    g.SmoothingMode = SmoothingMode.AntiAlias;
    g.CompositingQuality = CompositingQuality.HighQuality;
    using (GraphicsPath path = new GraphicsPath())
    {
        path.StartFigure();
        path.AddArc(DrawingArea, 0, 360);
        path.CloseFigure();
        using (Pen p = new Pen(Color.Blue, 2))
            g.DrawPath(p, path);
    }
}

private void DrawCircle2(Graphics g, RectangleF DrawingArea)
{
    DrawingArea.Inflate(-1, -1);

    g.SmoothingMode = SmoothingMode.AntiAlias;
    g.CompositingQuality = CompositingQuality.HighQuality;
    using (Pen p = new Pen(Color.Red, 2))
        g.DrawEllipse(p, DrawingArea);
}

Вы также можете сделать рисунок предметом, если хотите показывать его только в некоторых случаях.
Например, если щелкнуть Button1, он изменит условие переменной, установив для него значение false, а затем заставит Label1 перерисовать себя, вызвав метод Invalidate(). Если фигура уже нарисована, она будет удалена:

private bool DrawThisCircle = true;

private void button1_Click(object sender, EventArgs e)
{
    DrawThisCircle = false;
    label1.Invalidate();
}

private void label1_Paint(object sender, PaintEventArgs e)
{
    if (DrawThisCircle)
        DrawCircle1(e.Graphics, label1.ClientRectangle);
}
0 голосов
/ 10 мая 2018

Вы рисуете на Form, а не на Label. Вместо переопределения OnPaint метода Form, попробуйте обработать Paint событие Label элементов управления. Например:

private void label1_Paint(object sender, PaintEventArgs e)
{
    e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
    e.Graphics.DrawEllipse(Pens.Red, 0, 0, label1.Height - 1, label1.Height - 1);
}
...