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

时间 2019-02-22
阅读 42
点赞 0
收藏 0
连接b-iqbal

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

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

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

我想让它的字体大小的文本改变,使它完全适合面板,因为一些复杂的表达式可能有很多行的工作,因此可能不适合屏幕。

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

因此,我试图使标签的字体大小发生变化,以使表达式适合面板,但限制最大字体大小,以便少量文本不使用大字体。

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

WorkingOutLabel.Font = new Font(WorkingOutLabel.Font.FontFamily, 
    PanelHoldingWorkingLabel.Font.Height, FontStyle.Regular);
建议答案

从标签派生的自定义控件,该标签可缩放其文本大小以适应控件的边界。
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);
        }
    }
}
👍 0