Resize text size of a label when the text gets longer than the label size?

You can use my code snippet below. System needs some loops to calculate the label's font based on text size.

while(label1.Width < System.Windows.Forms.TextRenderer.MeasureText(label1.Text, 
     new Font(label1.Font.FontFamily, label1.Font.Size, label1.Font.Style)).Width)
{
    label1.Font = new Font(label1.Font.FontFamily, label1.Font.Size - 0.5f, label1.Font.Style);
}

Label scaling

private void scaleFont(Label lab)
{
    Image fakeImage = new Bitmap(1, 1); //As we cannot use CreateGraphics() in a class library, so the fake image is used to load the Graphics.
    Graphics graphics = Graphics.FromImage(fakeImage);

    SizeF extent = graphics.MeasureString(lab.Text, lab.Font);

    float hRatio = lab.Height / extent.Height;
    float wRatio = lab.Width / extent.Width;
    float ratio = (hRatio < wRatio) ? hRatio : wRatio;

    float newSize = lab.Font.Size * ratio;

    lab.Font = new Font(lab.Font.FontFamily, newSize, lab.Font.Style);
}

TextRenderer Approach pointed out by @ToolmakerSteve in the comments

private void ScaleFont(Label lab)
{
    SizeF extent = TextRenderer.MeasureText(lab.Text, lab.Font);

    float hRatio = lab.Height / extent.Height;
    float wRatio = lab.Width / extent.Width;
    float ratio = (hRatio < wRatio) ? hRatio : wRatio;

    float newSize = lab.Font.Size * ratio;

    lab.Font = new Font(lab.Font.FontFamily, newSize, lab.Font.Style);
}

Based on the article provided by @brgerner, I'll provide the alternative implementation here, as that one marked as an answer is not so efficient nor complete as this one below:

public class FontWizard
{
    public static Font FlexFont(Graphics g, float minFontSize, float maxFontSize, Size layoutSize, string s, Font f, out SizeF extent)
    {
        if (maxFontSize == minFontSize)
            f = new Font(f.FontFamily, minFontSize, f.Style);

        extent = g.MeasureString(s, f);

        if (maxFontSize <= minFontSize)
            return f;

        float hRatio = layoutSize.Height / extent.Height;
        float wRatio = layoutSize.Width / extent.Width;
        float ratio = (hRatio < wRatio) ? hRatio : wRatio;

        float newSize = f.Size * ratio;

        if (newSize < minFontSize)
            newSize = minFontSize;
        else if (newSize > maxFontSize)
            newSize = maxFontSize;

        f = new Font(f.FontFamily, newSize, f.Style);
        extent = g.MeasureString(s, f);

        return f;
    }

    public static void OnPaint(object sender, PaintEventArgs e, string text)
    {
        var control = sender as Control;
        if (control == null)
            return;

        control.Text = string.Empty;    //delete old stuff
        var rectangle = control.ClientRectangle;

        using (Font f = new System.Drawing.Font("Microsoft Sans Serif", 20.25f, FontStyle.Bold))
        {
            SizeF size;
            using (Font f2 = FontWizard.FlexFont(e.Graphics, 5, 50, rectangle.Size, text, f, out size))
            {
                PointF p = new PointF((rectangle.Width - size.Width) / 2, (rectangle.Height - size.Height) / 2);
                e.Graphics.DrawString(text, f2, Brushes.Black, p);
            }
        }
    }
}

and the usage:

val label = new Label();
label.Paint += (sender, e) => FontWizard.OnPaint(sender, e, text);