Как сделать текст метки масштабируемым в приложении Winforms

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

интересно, есть ли лучший способ сделать это, что может работать больше как свойство привязки в приложении Winforms.

2 ответов


Я знал, что ответ скрыт где-то в графическом объекте и событии paint, играя с этими 2 ключевыми словами, решил мою проблему. Вот решение, которое сработало в моем конкретном случае.

Я просто изменяю размер шрифта на событии paint для моей метки следующим образом:

private void myLabel_Paint(object sender, PaintEventArgs e)
{
     float fontSize = NewFontSize(e.Graphics, parentContainer.Bounds.Size, myLabel.Font, myLabel.Text);
     Font f = new Font("Arial", fontSize, FontStyle.Bold);
     myLabel.Font = f;
}

где как функция NewFontSize выглядит так:

public static float NewFontSize(Graphics graphics, Size size, Font font, string str)
{
    SizeF stringSize = graphics.MeasureString(str, font);
    float wRatio = size.Width / stringSize.Width;
    float hRatio = size.Height / stringSize.Height;
    float ratio = Math.Min(hRatio, wRatio);
    return font.Size * ratio;
}

Я также нашел эту статью полезный http://www.switchonthecode.com/tutorials/csharp-tutorial-font-scaling


Это немного расширяет принятый ответ и работает для меня:

сначала я определил свое "золотое сечение", настроив обычную метку в дизайнере с размером шрифта, который хорошо выглядит с меткой.Свойство Height установлено на 100. Здесь я получил шрифт emSize 48.0 F.

затем в переопределении OnPaint, если отношение 100.0 / 48.0 изменения тогда просто один раз отрегулируйте шрифт и сохраните новое соотношение (таким образом, нам не нужно делать новый шрифт каждый раз, когда элемент управления рисует).

он отлично работает, чтобы просто положить его в Панель инструментов, когда вы закончите вместе с обычной меткой.

public partial class LabelWithFontScaling : Label
{
    public LabelWithFontScaling()
    {
        InitializeComponent();
    }
    private void InitializeComponent()
    {
        this.SuspendLayout();
        this.Name = "label1";
        this.Size = new System.Drawing.Size(250, 100);
        this.ResumeLayout(false);
    }
    float mRatio = 1.0F;
    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);
        float ratio = e.ClipRectangle.Height / 100.0F;
        if ((ratio > 0.1) && (ratio != mRatio))
        {
            mRatio = ratio;
            base.Font = new Font(Font.FontFamily, 48.0F * ratio, Font.Style);
        }
    }