2

我正在尝试编写一种方法来调整文本字体大小,以便文本在控件中正确且完全可见。

我为此尝试的方法如下,

public static void FitControlFont(Control control)
        {
            if (control.Text.Length == 0)
            {
                return;
            }

            Font currentFont = control.Font;
            Graphics graphics = control.CreateGraphics();
            SizeF newSize = graphics.MeasureString(control.Text, control.Font);
            graphics.Dispose();

            float factorX = control.Width / newSize.Width;
            float factorY = control.Height / newSize.Height;
            float factor = factorX > factorY ? factorY : factorX;
            if (control.InvokeRequired)
            {
                control.Invoke(new MethodInvoker(delegate { control.Font = new Font(currentFont.Name, currentFont.SizeInPoints * factor); }));
            }
            else
            {
                control.Font = new Font(currentFont.Name, currentFont.SizeInPoints * factor);
            }
        }

上述方法效果很好,但是,我的问题是如何将文本用作多行?我得到单行文本(因为文本看起来非常小)。

我使用标签和按钮作为我在文本更改时需要调整文本字体大小的表单中的控件。

4

1 回答 1

0

这种方法将完成这项工作。它可能看起来有点复杂,因为它必须以两种方式工作:如果初始文本太小则增加文本大小,或者如果初始文本太大则减小它。

如果文本太小,它会增加,直到它不能垂直适应(因为水平它会自己分成几行)。

如果文本太大,它将被缩小,直到它可以适合控件的矩形。

控件必须是多行的。

您可以通过更改变量的值来控制大小的变化step

public static void FitControlFont(Control control)
{
    if (control.Text.Length == 0)
    {
        return;
    }

    Graphics graphics = control.CreateGraphics();
    Font newFont = (Font)control.Font.Clone();
    bool sizeFound = false; // to test if we already found the right size
    bool initiallyToSmall = false; // is the initial text to small (we will increase the font size) or too big (decrease the font size)
    float step = 1F; // increase/decrease step
    SizeF newSize = graphics.MeasureString(control.Text, newFont, new SizeF(control.Width, control.Height));
    if (newSize.Width <= control.Width && newSize.Height <= control.Height)
        initiallyToSmall = true;

    do
    {
        newSize = graphics.MeasureString(control.Text, newFont, new SizeF(control.Width, control.Height * 2));
        if (initiallyToSmall)
        {
            if (newSize.Height > control.Height)
            {
                newFont = new Font(control.Font.Name, newFont.SizeInPoints - step); // get previous size
                sizeFound = true;
            }
            else
                newFont = new Font(control.Font.Name, newFont.SizeInPoints + step);
        }
        else
        {
            if (newSize.Width <= control.Width && newSize.Height <= control.Height)
                sizeFound = true;
            else
                newFont = new Font(control.Font.Name, newFont.SizeInPoints - step);
        }

    } while (!sizeFound && newFont.SizeInPoints > 1 && newFont.SizeInPoints < 100);

    graphics.Dispose();

    if (control.InvokeRequired)
    {
        control.Invoke(new MethodInvoker(delegate { control.Font = newFont; }));
    }
    else
    {
        control.Font = newFont;
    }
}
于 2013-11-11T11:57:26.340 回答