【问题标题】:Resize a Label's font size to fit within a Panel without exceeding a maximum font size调整标签的字体大小以适应面板而不超过最大字体大小
【发布时间】:2019-02-21 21:57:49
【问题描述】:

我创建了一个布尔代数简化器。为此,我在简化过程中的关键阶段取表达式,将其添加到列表中,最后使用这些表达式来展示计算机如何简化表达式。例如。对于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);

【问题讨论】:

  • 您想减小字体大小,以便生成的文本与预定义的宽度匹配,还是您想拉伸/压缩文本,保持相同的字体高度或文本应该简单包裹在指定区域内?
  • @Jimi 我不明白你的意思。我需要它来适应面板,这样面板的宽度和高度就可以看作是预定义的边界。
  • 我认为 Jimi 说有 3 种方法可以做到这一点:减小字体大小(我相信这是您所要求的),压缩文本(字母变窄但高度保持不变),或者换行。
  • 如果您认为缩放字体以适合您的区域可能对您有用,您可以使用Graphics.ScaleTransform() 方法,其中缩放是容器宽度与字符串测量宽度之间的关系(当字符串宽度大于容器宽度时)。
  • @RufusL 感谢您的澄清。我想减小和增大字体大小。

标签: c# winforms graphics gdi+


【解决方案1】:

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

示例功能:

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);
        }
    }
}

【讨论】:

    猜你喜欢
    • 2018-10-16
    • 1970-01-01
    • 1970-01-01
    • 2013-06-04
    • 2016-11-27
    • 2011-05-23
    • 1970-01-01
    • 2011-02-07
    • 2016-12-19
    相关资源
    最近更新 更多