web-dev-qa-db-fra.com

Redimensionner la taille du texte d'une étiquette lorsque le texte est devenu plus long que la taille de l'étiquette?

J'ai une étiquette qui indique le nom du fichier. Je devais définir AutoSize de l'étiquette sur False pour la conception.
Ainsi, lorsque le texte du nom de fichier est plus long que la taille de l'étiquette, il est coupé comme dans l'image.

enter image description here

label1.Size = new Size(200, 32);
label1.AutoSize = false;

Comment redimensionner automatiquement le texte pour l'adapter à la taille de l'étiquette, lorsque le texte est plus long que la taille de l'étiquette?

20
Murhaf Sousli

Vous pouvez utiliser mon extrait de code ci-dessous. Le système a besoin de quelques boucles pour calculer la police de l'étiquette en fonction de la taille du texte. 

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

Mise à l'échelle des étiquettes

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

    }
8
Andro72

Sur la base du article fourni par @brgerner, je fournirai ici la variante de mise en œuvre, car celle qui est marquée comme réponse n'est pas aussi efficace ni complète que celle-ci:

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

et l'utilisation:

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

J'utilise l'astuce de mise à l'échelle pondérée suivante pour fournir un bon ajustement, c'est-à-dire qu'un compromis pondéré est effectué entre l'ajustement de la hauteur et l'ajustement de la largeur. C'est dans VB .net, mais je pense que vous pouvez facilement traduire en C #.

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
Chiel ten Brinke