【问题标题】:Resizing of text size when text changes to fit in the control当文本更改以适合控件时调整文本大小
【发布时间】:2013-11-23 04:07:43
【问题描述】:

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

我为此尝试的方法如下,

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

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

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

【问题讨论】:

  • 如果您的文字不合适,是否要垂直调整大小?
  • 我实际上不想调整控件大小,只想调整文本大小以使用完整的控件空间。
  • Graphics.MeasureString 有几个重载,您需要使用带有额外 SizeF(最大尺寸)的重载,并且可能使用与您在 DrawString 调用中使用的匹配的 StringFormat。支持 TextRenderer 而不是 Graphics。
  • @NomeshGajare 您是否尝试将实际多行文本 传递到MeasureString?只要MeasureString 工作正常,这段代码对我来说就可以。

标签: c# winforms font-size


【解决方案1】:

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

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

如果文本过大,则会缩小,直到可以放入控件的矩形中。

控件必须是多行的。

你可以通过改变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;
    }
}

【讨论】:

  • 感谢您的解决方案。但是当我突然最小化视图时,控件上的所有文本都不完整(水平剪切)并且需要很多时间才能再次变为正常大小
猜你喜欢
  • 2015-09-16
  • 1970-01-01
  • 1970-01-01
  • 2012-02-29
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多