如何在标签(Label)和数字选择框(NumericUpDown)中获取文本基线的位置?

10

我正尝试通过它们们的文本基线将一个 Label 和一个 NumericUpDown 对齐。这是在代码中实现,而非设计师。我该如何获取文本基线的位置?

2个回答

17

// 在坐标 (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

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

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

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

这个相同的方法也适用于NumericUpDown控件。


GetHeight不返回字体基线的位置,而是下一行顶部的位置。在这方面,Windows字体存在问题。这里没有简单的答案。 - dar7yl
我注意到Stewbob对我对他的回答进行了负面评价并感到不满,于是他报复性地对我的一些帖子进行了负面评价。我选择高尚的道路,不将这件事升级为全面战争。 - dar7yl
@dar7yl...嗯...你是谁?我看到你对我的帖子有评论,但我不明白最后一个评论的意思? - Stewbob
1
@dar7yl:我进行了一些调查。结果发现我的一名员工出于错误和愚蠢的忠诚表现得像个混蛋。我们已经谈过职业素养,不用说,这不会再发生了,整个部门都将拥有自己的《Clean Coder》个人副本。代表我们的组织向你道歉。请告诉我你失去了多少声誉,我会确保它得到恢复。...在调查过程中没有程序员受到伤害(但情况却很危急)。 - Stewbob
@dar7yl:不当的投票已经被更正。感谢您向我提出此事。 - Stewbob
3
感谢你的体贴和专业的回复,这让我对人性恢复了信心。 - dar7yl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接