Измените размер шрифта метки, чтобы он соответствовал панели, не превышая максимальный размер шрифта. - PullRequest
0 голосов
/ 22 февраля 2019

Я создал булев алгебраический упрощатель.Для этого я беру выражение на ключевых этапах процесса упрощения, добавляю его в список и в конце использую эти выражения, чтобы показать, как компьютер упростил выражение.Например, для B•(A+~A) содержимое ярлыка будет:

B•(A+~A) // Initial Expression 
= B•(1)  // Brackets simplified 
= B•1    // Brackets removed 
= B      // Simplified expression.

Я создал стандартную панель и перетащил ярлык в нее, чтобы закрепить ярлык внутри панели.

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

Однако, если пользователь вводит действительно простое выражение, например A+1, ответ и рабочие строки будут небольшими.В этом случае я не хочу, чтобы текст заполнял панель, так как шрифт был бы огромным.

Поэтому я пытаюсь сделать так, чтобы размер шрифта метки изменялся, чтобы выражение вписывалось в Panel, но ограничивал максимальный размер шрифта, чтобы небольшой объем текста не использовал огромный размер шрифта.

Кто-нибудь знает, как это сделать?
Я искал в Интернете и нашел следующий код, однако он не заполняет панель:

WorkingOutLabel.Font = new Font(WorkingOutLabel.Font.FontFamily, 
    PanelHoldingWorkingLabel.Font.Height, FontStyle.Regular);

1 Ответ

0 голосов
/ 22 февраля 2019

Пользовательский элемент управления, полученный из Label, который масштабирует размер текста в соответствии с границами элемента управления.
A Graphics.ScaleTransform () применяется, когда вычисленная ширина текста больше, чем ширина элемента управленияClientArea.
Текст масштабируется при изменении размеров элементов управления и / или при изменении текста.

Пример функциональности:

Label Dynamic Autoscale

using System.ComponentModel;
using System.Drawing;
using System.Drawing.Text;
using System.Windows.Forms;

[DesignerCategory("Code")]
class AutoScaleLabel : Label
{
    public AutoScaleLabel() => InitializeComponent();

    private void InitializeComponent()
    {
        this.SetStyle(ControlStyles.AllPaintingInWmPaint |
                      ControlStyles.UserPaint |
                      ControlStyles.ResizeRedraw, true);
        this.UpdateStyles();
    }

    protected override void OnLayout(LayoutEventArgs e)
    {
        base.OnLayout(e);
        this.AutoSize = false;
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        using (SolidBrush brush = new SolidBrush(this.ForeColor))
        using (StringFormat format = new StringFormat(StringFormatFlags.NoClip | 
               StringFormatFlags.NoWrap | StringFormatFlags.FitBlackBox))
        {
            format.Trimming = StringTrimming.None;
            SizeF textSize = e.Graphics.MeasureString(this.Text, this.Font, this.ClientSize, format);
            if (textSize.Width > this.ClientSize.Width)
            {
                float scale = (float)this.ClientSize.Width / textSize.Width;
                e.Graphics.ScaleTransform(scale, scale);
            }
            e.Graphics.Clear(this.BackColor);
            e.Graphics.TextRenderingHint = TextRenderingHint.ClearTypeGridFit;
            e.Graphics.DrawString(this.Text, this.Font, brush, this.ClientRectangle, format);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...