在c#中尽可能大地绘制Winform标签内的内圈

时间:2018-05-10 09:36:42

标签: c# winforms label system.drawing drawing2d

我有一个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

1 个答案:

答案 0 :(得分:1)

您正在使用Form而不是Label。不要覆盖OnPaint的{​​{1}}方法,而是尝试处理Form Paint次控制事件。例如:

Label