C# 获取WinForms字体的精确高度(以像素为单位)
这可能是一个重复的问题,但我找不到答案 我唯一的问题是如何获得WinForms中使用的C# 获取WinForms字体的精确高度(以像素为单位),c#,winforms,fonts,fontmetrics,C#,Winforms,Fonts,Fontmetrics,这可能是一个重复的问题,但我找不到答案 我唯一的问题是如何获得WinForms中使用的字体的高度(上升+下降,没有任何间距),以像素为单位。 我有SegoeUI8.25常规字体 Font.Height给我15(像素?) 我可以使用FontFamily获取字体度量: GetEmHeight给我2048 GetCellAscent给我2210(比EM大?) GetCellDescent给我514 根据 我应该做以下几点: (ascent + descent) * font.Height / em
字体的高度(上升+下降,没有任何间距),以像素为单位。
我有SegoeUI8.25常规字体
Font.Height
给我15(像素?)
我可以使用FontFamily
获取字体度量:
GetEmHeight
给我2048
GetCellAscent
给我2210(比EM大?)
GetCellDescent
给我514
根据
我应该做以下几点:
(ascent + descent) * font.Height / emHeight
which is
(514 + 2210) * 15 / 2210 = 19 pixels.
因此:
- 使用MSDN的公式计算得到19px文本高度
TextRenderer.MeasureText
为“Tg”字符串提供13px
- 如果a在Photoshop中截图并测量它(从g的下限到T的上限),我将收到10px
我做错了什么,这些价值观是如何相互联系的?目标是尽可能接近屏幕截图的测量结果
TextRenderer.MeasureText
使用了大量资源,在绘制过程中我无法随时使用它。要获得像素,请使用转换公式:
descentPixel = font.Size * descent / fontFamily.GetEmHeight(FontStyle.Regular);
通过此链接获取像素,可以使用转换公式:
descentPixel = font.Size * descent / fontFamily.GetEmHeight(FontStyle.Regular);
从这个链接中你想实现什么?要获得像素,你可以使用转换公式。@Aybe只是想知道渲染计算中文本的高度。如果文本确实是单行的,则无需计算换行字(这是一种资源广泛的方式),字体的高度就足够了。您使用的是font.height,而您的引用使用的是font.Size。这与@HéctorManuelMartinezDurán的答案相同,对于他的回答,你应该为你的评论向他道歉。你想达到什么目的?要获得像素,你需要使用转换公式。@Aybe只是想知道渲染计算中文本的高度。如果文本确实是单行的,则无需计算换行字(这是一种资源广泛的方式),字体的高度就足够了。您使用的是font.height,而您的引用使用的是font.Size。这与@HéctorManuelMartinezDurán的答案相同,对于他的回答,你们应该为你们的评论向他道歉。请仔细阅读这个问题。我使用了这个公式,得到了几乎两倍于要求的高度。19像素而不是10像素请仔细阅读问题。我使用了这个公式,得到了几乎两倍于要求的高度。19像素而不是10像素