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

后端 未结 7 656
旧巷少年郎
旧巷少年郎 2020-12-05 07:47

I have a label that shows the file name .. I had to set AutoSize of the label to False for designing.
So when the file name text got longer tha

相关标签:
7条回答
  • 2020-12-05 07:57

    this method worked for me

    simply you will reduce font size until it reach the width you want.

    while (label1.Width >150 )
    {
        label1.Font = new Font(label1.Font.FontFamily, label1.Font.Size - 0.5f, label1.Font.Style);
    }
    
    0 讨论(0)
  • 2020-12-05 08:00

    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);
    }
    
    0 讨论(0)
  • 2020-12-05 08:03

    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);
    
    0 讨论(0)
  • 2020-12-05 08:03

    I use the following weighted scaling trick to provide a good fit, i.e. a weighted tradeoff is made between fitting the height and fitting the width. It's in VB .net, but I think you can translate to C# easily.

    Function shrinkFontToFit(f As Font, text As String, requiredsize As SizeF) As Font
        Dim actualsize As SizeF = TextRenderer.MeasureText(text, f)
        Return New Font(f.FontFamily, f.Size * (requiredsize.Width + requiredsize.Height ) _
            / (actualsize.Width + actualsize.Height), f.Style, GraphicsUnit.Pixel)
    End Function
    
    0 讨论(0)
  • 2020-12-05 08:03

    With inspiration from @bnguyen82 i came up with something that works all the way.

    public static void ScaleLabel(Label label, float stepSize = 0.5f)
    {
        //decrease font size if text is wider or higher than label
        while (lblTextSize() is Size s && s.Width > label.Width || s.Height > label.Height)
        {
            label.Font = new Font(label.Font.FontFamily, label.Font.Size - stepSize, label.Font.Style);
        }
    
        //increase font size if label width is bigger than text size
        while (label.Width > lblTextSize().Width)
        {
            var font = new Font(label.Font.FontFamily, label.Font.Size + stepSize, label.Font.Style);
            var nextSize = TextRenderer.MeasureText(label.Text, font);
    
            //dont make text width or hight bigger than label
            if (nextSize.Width > label.Width || nextSize.Height > label.Height)
                break;
    
            label.Font = font;
        }
    
        Size lblTextSize() => TextRenderer.MeasureText(label.Text,
            new Font(label.Font.FontFamily, label.Font.Size, label.Font.Style));
    }
    

    PS: In order for this to work the label needs to have AutoSize = false and either to be docked or anchored.

    0 讨论(0)
  • 2020-12-05 08:05

    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);
    }
    
    0 讨论(0)
提交回复
热议问题