在 x 轴上打印:起始位置不准确 - x 轴是否有 value/function?

Printing on the x-axis: start position not exact - is there a value/function for the x-axis?

我遇到了

的问题
e.Graphics.DrawString(TextToPrint, Font, Brush, New RectangleF(StartPositionX, StartPositionY, Width, Height))

假设我想在距左边缘 x 轴 25mm 的 Arial-20pt 中打印 "Hello World"。另外我用的是Arial-50pt的版本

为此我设置了

e.Graphics.PageUnit = GraphicsUnit.Millimeter

PrintDocument.OriginAtMargins = False

我通过 "PDFCreator" 打印 PDF 并使用 Acrobat Reader 的测量工具。

y轴上的位置是你想要的。检查!

"H" 开始于大约 26.6mm (Arial-20pt) / 29.3mm (Arial-50pt)。

所以我也在

的相同起点打印了一个矩形
e.Graphics.FillRectangle

并将其填充为绿色。

这个矩形从 25mm 开始!!

所以我假设文本周围有一些边距。在 y 轴上,可以借助 "CellAscent".

找到 "H" 的最低点

x轴有value/function吗?

这是我的代码:

e.Graphics.PageUnit = GraphicsUnit.Millimeter
PrintDocument.OriginAtMargins = False

TextToPrint = "Hello World"
Font = New Font("Arial", 20)
Brush = Brushes.Black
StartPositionX = 25
StartPositionY = 30
Width = 50
Height = 60

我想使用 "H" 的第一个左下像素的确切位置作为我的起点。对于 y 轴,这有效:

CellAscent = Font.Size * CSng(Font.FontFamily.GetCellAscent(Font.Style)/ Font.FontFamily.GetEmHeight(Font.Style))

StartPositionY = StartPositionY - CellAscent

调整后我使用

e.Graphics.DrawString(TextToPrint, Font, Brush, New RectangleF(StartPositionX, StartPositionY, .Width, .Height))

已解决

C# Font character rendering (GDI Bug)

“要避免这些问题,请执行以下操作:

始终向 MeasureString 和 DrawString 传递一个基于印刷 StringFormat (GenericTypographic) 的 StringFormat 对象。 -和- 将 TextRenderingHint 图形设置为 TextRenderingHintAntiAlias 。

这些措施禁用了在运行端添加的额外1/6 em,通过使用抗锯齿避免了网格拟合的问题 和子像素字形定位,并产生完美可缩放的文本” (来自:http://support.microsoft.com/kb/307208

DrawString(myText, myFont, myBrush, myPoint, StringFormat.GenericTypographic)