Willy
Willy

Reputation: 10652

Drawing an inner circle as big as possible within a Label

I have a Label and I am trying to draw an inner circle (not filled) inside this Label, as big as possible.

I have tried two methods, one method applied to label1 and another one applied to label2. In both cases it does not work.

Note: the Label should keep its background color and content.

How can I get rid of this?

Code:

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

Below a screenshot:

enter image description here

Upvotes: 1

Views: 952

Answers (2)

Jimi
Jimi

Reputation: 32248

Same procedures you're using now, calling them from a control's Paint() event.
It's the same if you're creating a Custom control. Use the overridden OnPaint() event in this case.

In the control's Paint() event, call one/more methods to draw a shape on the control's surface.

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

Use the Control's ClientRectangle bounds to derive the size of the figure.
Here, the ClientRectangle is reduced by 1 when using Graphics.DrawEllipse() and by 2 when using Graphics.DrawPath(). The two methods calculate the pen size in relation to the drawing area in a slightly different manner.

private void DrawCircle1(Graphics g, RectangleF canvas)
{
    canvas.Inflate(-2, -2);
    g.SmoothingMode = SmoothingMode.AntiAlias;

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

private void DrawCircle2(Graphics g, RectangleF canvas)
{
    canvas.Inflate(-1, -1);
    g.SmoothingMode = SmoothingMode.AntiAlias;

     using (Pen p = new Pen(Color.Red, 2)) {
        g.DrawEllipse(p, canvas);
     }
}

Upvotes: 1

Reza Aghaei
Reza Aghaei

Reputation: 125227

You are drawing on Form not the Label. Instead of overriding OnPaint method of the Form, try to handle Paint event of Label controls. For example:

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

Upvotes: 1

Related Questions