如何在使用System.Windows.Forms.TextRenderer时计算.NET中文本的基线?

如何在使用System.Windows.Forms.TextRenderer时计算.NET中文本的基线?,.net,vb.net,text,fonts,drawing,.net,Vb.net,Text,Fonts,Drawing,我的目标是通过指定文本的基线原点而不是.NET中默认的左上角原点来绘制文本 这似乎不起作用,或者我还在做错事 我已经尝试过graphics.DrawString(),但使用该方法,我还必须处理文本左侧不需要的填充 现在我使用System.Windows.Forms.TextRenderer在位图上绘制。通过添加System.Windows.Forms.TextFormatFlags.Nop,很容易去掉左边的填充 正如您在示例中所看到的,[P1]是所需的基线。[P2]是根据上面链接中的示例计算的

我的目标是通过指定文本的基线原点而不是.NET中默认的左上角原点来绘制文本

这似乎不起作用,或者我还在做错事

我已经尝试过graphics.DrawString(),但使用该方法,我还必须处理文本左侧不需要的填充

现在我使用System.Windows.Forms.TextRenderer在位图上绘制。通过添加System.Windows.Forms.TextFormatFlags.Nop,很容易去掉左边的填充

正如您在示例中所看到的,[P1]是所需的基线。[P2]是根据上面链接中的示例计算的基线

Dim ascent As Integer = font.FontFamily.GetCellAscent(FontStyle.Regular)
Dim lineSpacing As Integer = font.FontFamily.GetLineSpacing(FontStyle.Regular)
Dim baseline As Single = font.GetHeight(graphics) * ascent / lineSpacing
Dim baselinePoint As PointF = _originPointF
baselinePoint.Y += baseline

正如您所看到的,[P2]在y轴上结束得太远

我的想法是,如果我能得到正确的基线计算,我只使用y值作为偏移量

正如您在示例中所看到的,[P1]位于红色文本的基线处。这实际上是Android API在绘制文本时的行为,我正试图在.NET中模拟它

我使用的机器人字体可以下载。(我希望字体中没有什么奇怪的地方。)

在[P1]和“Afh”的顶部之间有这个空间。如果这是外部领先,那么通过System.Windows.Forms.VisualStyles.VisualStyleRenderer.GetTextMetrics()来实现这一点似乎相当麻烦,我感觉自己遗漏了一些东西

据我所知,“A”的高度是GetCellAscent值

以下是一些到目前为止我发现很有用的链接:


从字体中获取良好的度量标准确实从字体本身开始。它的效果如何与你在上面花了多少钱成正比。从字体中获得好的指标确实从字体本身开始。它的效果如何与你在上面花了多少钱成正比。从字体中获得好的指标确实从字体本身开始。它的效果与你花在它上面的钱成正比。