6

我正在寻找一种方法来使标签中的文本可缩放以适合整个父容器。我能想到的一种方法是在窗口重新调整大小时获取容器大小,然后相应地增加或减小字体大小,但这会限制它的可能性。

想知道是否有更好的方法可以做到这一点,它可能更像是 Winforms 应用程序中的锚属性。

4

2 回答 2

4

我知道答案隐藏在图形对象和绘画事件的某个地方,玩弄这两个关键字解决了我的问题。这是在我的特定情况下有效的解决方案。

我只是在为我的标签更改绘制事件的字体大小,如下所示:

private void myLabel_Paint(object sender, PaintEventArgs e)
{
     float fontSize = NewFontSize(e.Graphics, parentContainer.Bounds.Size, myLabel.Font, myLabel.Text);
     Font f = new Font("Arial", fontSize, FontStyle.Bold);
     myLabel.Font = f;
}

NewFontSize 函数如下所示:

public static float NewFontSize(Graphics graphics, Size size, Font font, string str)
{
    SizeF stringSize = graphics.MeasureString(str, font);
    float wRatio = size.Width / stringSize.Width;
    float hRatio = size.Height / stringSize.Height;
    float ratio = Math.Min(hRatio, wRatio);
    return font.Size * ratio;
}

我还发现这篇文章很有帮助 http://www.switchonthecode.com/tutorials/csharp-tutorial-font-scaling

于 2012-12-13T02:57:49.517 回答
1

这扩展了已接受的答案并为我工作:

首先,我通过在设计器中设置一个正常的标签来确定我的“黄金比例”,该标签的字体大小在 Label.Height 属性设置为 100 时看起来不错。这就是我得到 48.0F 的字体 emSize 的地方。

然后在 OnPaint 覆盖中,如果 100.0/48.0 的比例发生变化,那么只需调整一次字体并保存新的比例(这样我们就不必在每次绘制控件时都制作新字体)。

当您与常规标签一起完成后,将其放入您的工具箱中效果很好。

public partial class LabelWithFontScaling : Label
{
    public LabelWithFontScaling()
    {
        InitializeComponent();
    }
    private void InitializeComponent()
    {
        this.SuspendLayout();
        this.Name = "label1";
        this.Size = new System.Drawing.Size(250, 100);
        this.ResumeLayout(false);
    }
    float mRatio = 1.0F;
    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);
        float ratio = e.ClipRectangle.Height / 100.0F;
        if ((ratio > 0.1) && (ratio != mRatio))
        {
            mRatio = ratio;
            base.Font = new Font(Font.FontFamily, 48.0F * ratio, Font.Style);
        }
    }
于 2018-08-14T20:59:50.817 回答