如何获取标签和 NumericUpDown 中文本基线的位置?

Posted

技术标签:

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

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

【问题讨论】:

【参考方案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”个人副本。我代表我们的组织道歉。让我知道你失去了多少声誉,我会看到它恢复。 ...在本次调查过程中没有编码人员受到伤害(但接近)。 感谢您的周到和专业的回复。我对人类的信仰已经恢复。

以上是关于如何获取标签和 NumericUpDown 中文本基线的位置?的主要内容,如果未能解决你的问题,请参考以下文章

在numericUpDown更改事件中获取numericUpDown更改的值

WinForms NumericUpDown:有没有办法阅读有关文本选择的信息?

文本框和标签数组如何在 C# 中的提交方法中获取值

如何从控件中获取标签文本?

如何在 VBA 中获取标签的内部文本,不包括嵌套标签中的文本?

关闭表单后如何保留 numericupdown 中的值