C# 如何获取文本基线和标签水平边框之间的距离?

C# 如何获取文本基线和标签水平边框之间的距离?,c#,winforms,C#,Winforms,我想得到文本基线和C#中标签底部边框之间的精确距离。我想这样做是因为我想在文本下画一条线(不想使用带下划线的字体,因为它太紧/接近文本) 以下是我的尝试: //This is placed in the custom label class int dy = (int)((ClientRectangle.Height - Font.GetHeight())/2); 但这并不准确,dy返回大约3,并且绘制到标签的线与文本基线的距离太远。若要获取标签的文本基线,请假设您位于图形处理程序中的自定义标

我想得到文本基线和C#中标签底部边框之间的精确距离。我想这样做是因为我想在文本下画一条线(不想使用带下划线的字体,因为它太紧/接近文本)

以下是我的尝试:

//This is placed in the custom label class
int dy = (int)((ClientRectangle.Height - Font.GetHeight())/2);

但这并不准确,dy返回大约3,并且绘制到标签的线与文本基线的距离太远。

若要获取标签的文本基线,请假设您位于图形处理程序中的自定义标签类内

Font myFont = this.Font;
FontFamily ff = myFont.FontFamily;

float lineSpace = ff.GetLineSpacing(myFont.Style);
float ascent = ff.GetCellAscent(myFont.Style);
float baseline = myFont.GetHeight(e.Graphics) * ascent / lineSpace;

功劳归你。

如果3太远,你就没有多少余地了。难道你不能仅仅减去1或2吗?从中减去一个常量被称为硬代码,当dpi改变时,它将被错误渲染。谢谢。如果硬编码会让你烦恼,那么只需计算一个%并删除它。但是,这也不会有太大的区别。计算不精确,不能根据dpi的变化进行缩放。然而,我测试了另一种方法,它似乎可以工作,我只是用Font.SizeInPoints替换Font.GetHeight(),但我不确定当dpi改变时它是否可以工作。我不明白为什么%不能工作。如果您希望您的线位于基线和边界的中间,50%的
dy
将完成此任务。您只需确定哪个%值将该行放置在您想要的位置并使用该值。嘿,这比我使用Font.SizeInPoints测试的方法更精确,该方法具有类似的结果(该行距离基线稍远,但差异非常小且可以接受)。谢谢