【问题标题】:Scale Label text in line with Label size根据标签大小缩放标签文本
【发布时间】:2018-10-25 10:33:51
【问题描述】:

正在寻找一种方法来调整 Labels 文本的大小以适应 Label 的大小变化。 (即,如果标签的大小增加50%,那么文本的大小也应该增加大约50%)。

有很多文章可以调整文本以完全适应Label 的大小,这不适合我想要的。
我已经有了这个的工作版本。

不知何故,我需要能够在调整大小完成后引用 Label 的先前大小,以确定用于调整文本大小的比率。

【问题讨论】:

  • 您很可能必须在标签的SizeChanged event handler 中自己实现此功能
  • 如果标签的高度或宽度仅增加 50%,而您将文本增加 50%,则它将不再匹配。在这些情况下,文本应该如何表现?对我来说,所有有意义的事情都是找出最大的字体大小,因此文本与框匹配(可能带有一些填充)。在某些情况下,其他任何事情都会失败。

标签: c# winforms graphics


【解决方案1】:

也许你可以简单地做的是获取标签的实际大小和里面的内容,然后使用一个因子来获得一个新的大小。

您可以使用;获取标签的渲染大小;

System.Drawing.Size TextRenderer.MeasureText (string text, System.Drawing.Font font);

在获得标签的渲染大小后,您可以通过将返回的大小乘以一个因子(例如:大小 *0.5)来重新设置 label.width 和 label.height,这将为您提供所需大小的一半。

您可以在 Label 的 SizeChanged 事件处理程序中使用相同的方法来确定 MeasuredSize;

  • 小于当前标签大小:增加字体大小直到达到 ~=labelsize
  • 大于当前标签大小:减小字体大小直到 ~=labelsize 或
  • 等于当前标签大小:什么都不做?

我希望我能给你一些关于如何实现这一点的见解。

【讨论】:

    【解决方案2】:

    使用Graphics.ScaleTransform() 的示例,用于将转换矩阵添加到随后的图形操作中。

    请注意,只要 Graphics 可以绘制给定大小的 Font,此转换就适用。如果字体太小或太大,渲染将无法按预期工作。
    最小字体大小应为8.5 ~ 9 磅且不超过72
    超出此范围,结果无法预测。 (例如,文本可能会简单地消失)。
    因此,应在设计时设置控件的最小/最大尺寸,并且不能超出这些措施。

    Label.TextAlign 属性在此处设置为 ContentAlignment.MiddleLeft
    另外:.AutoSize = false;.Text = "Some text that needs to fit";

    using System.Drawing;
    using System.Drawing.Drawing2D;
    using System.Drawing.Text;
    
    private void label1_Paint(object sender, PaintEventArgs e)
    {
        Label label = sender as Label;
        e.Graphics.TextRenderingHint = TextRenderingHint.ClearTypeGridFit;
        float TextWidth = e.Graphics.MeasureString(label.Text, label.Font, label.Size, StringFormat.GenericTypographic).Width;
        float scale = (label.ClientSize.Width - label.Padding.Left) / TextWidth;
        e.Graphics.Clear(label.BackColor);
        e.Graphics.ScaleTransform(scale, scale);
    
        using (SolidBrush brush = new SolidBrush(label.ForeColor))
            e.Graphics.DrawString(label.Text, label.Font, brush,  
                                  new RectangleF(PointF.Empty, label1.ClientSize), 
                                  StringFormat.GenericTypographic);
    }
    

    视觉效果:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-28
      • 1970-01-01
      • 2021-01-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多