【问题标题】:How do I get the position of the text baseline in a Label and a NumericUpDown?如何获取标签和 NumericUpDown 中文本基线的位置?
【发布时间】:2010-11-03 14:42:40
【问题描述】:

我正在尝试将 LabelNumericUpDown 与它们的文本基线对齐。我是在代码中做的,而不是设计师。如何获取文本基线的位置?

【问题讨论】:

    标签: c# .net winforms alignment baseline


    【解决方案1】:

    // 在坐标 (pt.X, pt.Y) 处以基线呈​​现文本:

    Font myFont = Label1.Font;
    FontFamily ff = myFont.FontFamily;
    
    float lineSpace = ff.GetLineSpacing(myFont.Style);
    float ascent = ff.GetCellAscent(myFont.Style);
    float baseline =  myFont.GetHeight(ev.Graphics) * ascent / lineSpace;
    
    PointF renderPt = new PointF(pt.X, pt.Y  - baseline));
    ev.Graphics.DrawString("Render this string", myFont, textBrush, renderPt);
    

    【讨论】:

      【解决方案2】:

      对于Label控件,可以这样获取文本底部的位置:

      假设 .TextAlign 设置为 TopLeft 或 TopCenter 或 TopRight,通过此方法可以找到 Label 控件中文本的底部:

      dim btmOfText  as single
      btmOfText = Label1.Font.GetHeight + Label1.Top
      

      .GetHeight 方法返回标签使用的当前字体的高度,以像素为单位。
      如果 .TextAlign 为 Middle 或 Bottom,则需要进行稍微复杂的计算。

      同样的方法也适用于 NumericUpDown 控件。

      【讨论】:

      • GetHeight 不返回字体基线的位置,而是返回下一行顶部的位置。 Windoze字体就是这样搞砸的。这里没有简单的答案。
      • 我注意到 Stewbob 对我对他的回答投反对票感到不满,并通过对我的一些帖子投反对票来进行报复。我在这里走上正轨,而不是将其升级为全面战争。
      • @dar7yl...嗯...你是谁?我看到你对我的帖子有 cmets,但我不明白最后一个?
      • @dar7yl:我做了一些调查。事实证明,我的一名员工以一种被误导和愚蠢的忠诚表达方式表现得像个混蛋。我们已经讨论过专业性,不用说,这种情况不会再发生了,整个部门都在获得他们自己的“The Clean Coder”个人副本。我代表我们的组织道歉。让我知道你失去了多少声誉,我会看到它恢复。 ...在本次调查过程中没有编码人员受到伤害(但接近)。
      • 感谢您的周到和专业的回复。我对人类的信仰已经恢复。
      猜你喜欢
      • 2017-06-18
      • 1970-01-01
      • 1970-01-01
      • 2013-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-11
      • 1970-01-01
      相关资源
      最近更新 更多