C#调整字体大小以适合容器

时间:2016-08-12 18:43:19

标签: c# winforms text-size

我正在创建一个包含大量tableLayoutPanel,标签和按钮的Windows窗体应用程序。在启动时以及调整表单大小时,我希望组件中的文本大小能够最好地适应组件,而不会削减单词的结尾。

如果有人可以帮助我们执行此操作的代码段,那么这对我有帮助!

提前致谢。

1 个答案:

答案 0 :(得分:2)

正如@Rakitić所说,你需要确保一切都是左,上,下,右锚定。

作为说明,我使用了一个大小的多行文本框来填充整个表单。然后我将以下代码放在SizeChanged事件中:

    private void textBox1_SizeChanged(object sender, EventArgs e)
    {
        TextBox tb = sender as TextBox;
        if (tb.Height < 10) return;
        if (tb == null) return;
        if (tb.Text == "") return;
        SizeF stringSize;

        // create a graphics object for this form
        using (Graphics gfx = this.CreateGraphics())
        {
            // Get the size given the string and the font
            stringSize = gfx.MeasureString(tb.Text, tb.Font);
            //test how many rows
            int rows = (int)((double)tb.Height / (stringSize.Height));
            if (rows == 0)
                return;
            double areaAvailable = rows * stringSize.Height * tb.Width;
            double areaRequired = stringSize.Width * stringSize.Height * 1.1;

            if (areaAvailable / areaRequired > 1.3)
            {
                while (areaAvailable / areaRequired > 1.3)
                {
                    tb.Font = new Font(tb.Font.FontFamily, tb.Font.Size * 1.1F);
                    stringSize = gfx.MeasureString(tb.Text, tb.Font);
                    areaRequired = stringSize.Width * stringSize.Height * 1.1;
                }
            }
            else
            {
                while (areaRequired * 1.3 > areaAvailable)
                {
                    tb.Font = new Font(tb.Font.FontFamily, tb.Font.Size / 1.1F);
                    stringSize = gfx.MeasureString(tb.Text, tb.Font);
                    areaRequired = stringSize.Width * stringSize.Height * 1.1;
                }
            }
        }
    }

在表单上有很多对象的情况下,我只选择一个,并使用它来设置与上面类似的自己的字体大小,然后对表单上的所有对象重复此字体大小。只要您允许合适的“误差范围”(处理自动换行等,上述技术应该可以帮助您。

此外,我强烈建议您在Form SizeChanged事件中为表单设置最小宽度和高度,否则可能会发生愚蠢的事情!