繁体   English   中英

重写/更改.NET Winforms标签控件的字体垂直对齐行为

[英]Override/Change .NET Winforms Font Vertical Alignment Behavior for Label Control

我有一个常规标签,其TextAlign属性设置为MiddleCenter。 该标签旨在保留带有分钟和秒的时间值,并将其用作秒表。

如果字体较小,则标签将正确垂直对齐。 但是,随着字体大小的增加,垂直对齐成为问题。

在此处查看屏幕截图,您将明白我的意思:

屏幕截图

据我了解,我认为.NET在技术上是正确的-从字体的意义上来说,垂直对齐是正确的,因为诸如字体上升和下降之类的事情。 但是,在这种情况下,这确实不符合我的需求。 在屏幕截图中,标签的顶部比标签的底部具有更多的空间。 当数字显示时,我希望这两部分相等。 我仅使用数字和冒号,因此我对如果包含其他字符(例如“ g”)的外观不感兴趣,例如“ g”显然会使像素悬挂在基线以下。

我尝试调整填充以强制执行此行为,但这只是导致文本被裁剪,.NET不允许我使用负填充/边距。 有什么简单的方法可以在这里完成我想要的吗? 我还尝试手动编辑ttf字体文件并更改字体上升/下降,以便.NET对其进行不同的对齐,但无法弄清楚。 谢谢你的建议。

我正在使用的字体文件已在此处下载: http : //www.fontspace.com/style-7/digital-7

看起来,如果比例很大,则文本只是“下沉”,并最终被截断。

在Form ResizeEnd事件上尝试以下操作:

    label1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
    //First make the font big enough
    double fontSize = label1.Width / label1.Text.Count();
    int height = label1.Height;
    fontSize = fontSize > 0 ? (double)fontSize : 1;
    if (fontSize < (height / 2))
    {
        fontSize = (height / 2);
    }
    label1.Font = new System.Drawing.Font(label1.Font.FontFamily, (float)fontSize, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));

    //then adjust the text to the label size
    while (label1.Width < System.Windows.Forms.TextRenderer.MeasureText(label1.Text,
        new Font(label1.Font.FontFamily, label1.Font.Size, label1.Font.Style)).Width ||
        label1.Height < System.Windows.Forms.TextRenderer.MeasureText(label1.Text,
        new Font(label1.Font.FontFamily, label1.Font.Size, label1.Font.Style)).Height)
    {
        label1.Font = new Font(label1.Font.FontFamily, label1.Font.Size > 1 ? label1.Font.Size - 0.5f : label1.Font.Size, label1.Font.Style);
        if (label1.ClientRectangle.Width < 3 || label1.ClientRectangle.Height < 3)
            break;
    }

我修改了这个: https : //stackoverflow.com/a/9645577/1027551

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM