С# Изменить размер шрифта, чтобы он соответствовал контейнеру

Я создаю приложение Windows Forms с большим количеством tableLayoutPanels, меток и кнопок. При запуске и при изменении размера формы я хотел бы, чтобы размер текста в компонентах максимально соответствовал компоненту, не обрезая концы слов.

Если кто-нибудь может помочь с фрагментом кода или чем-то еще для этого, это действительно поможет мне!

Заранее спасибо.


person Kasper Hansen    schedule 12.08.2016    source источник
comment
используйте свойство anchor и, во-вторых, опубликуйте свой фрагмент кода.   -  person Raktim Biswas    schedule 12.08.2016
comment
Извините за недоразумение, но у меня нет фрагмента кода, я хотел бы, чтобы какой-нибудь код изменил размер шрифта, чтобы он соответствовал уже измененным элементам управления, не обрезая концов.   -  person Kasper Hansen    schedule 12.08.2016


Ответы (1)


Как говорит @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, иначе могут произойти глупости!

person Community    schedule 13.08.2016