调整标签的字体大小以适合面板,而不超过最大字体大小

时间:2019-02-21 21:57:49

标签: c# winforms

我创建了一个布尔代数简化器。为此,我在简化过程中的关键阶段使用了该表达式,将其添加到列表中,最后使用这些表达式来说明计算机如何简化该表达式。例如。对于B•(A+~A),标签的内容为:

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

我创建了一个标准面板,并将标签拖放到其中,以将标签停靠在面板中。

我想这样做,以便更改文本的字体大小,使其完全适合面板,因为某些复杂的表达式可能需要很多行,因此可能不适合屏幕。

但是,如果用户输入了一个非常简单的表达式,例如A+1,答案和工作范围将很小。在这种情况下,我不希望文本填充面板,因为字体会很大。

因此,我试图这样做,以便更改Label的字体大小以使表达式适合面板,但限制最大字体大小,以便少量文本不使用大量字体。

有人知道怎么做吗?
我在网上搜索并找到了以下代码,但这未填充面板:

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

1 个答案:

答案 0 :(得分:1)

从Label派生的自定义控件,可缩放其文本大小以适合控件的边界。
当Text的计算宽度大于控件的ClientArea时,将应用Graphics.ScaleTransform()转换。
调整控件大小和/或更改文本时,将缩放文本。

示例功能:

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);
        }
    }
}
相关问题