gdi+ - Graphics.MeasureString 太宽或太窄
gdi+ - Graphics.MeasureString either too wide or too narrow
我正在使用 C# 中的 System.Drawing
库来测量字符串的大小:
SizeF size = gfx.MeasureString("Hello", myFont);
但是,这个 returns 大小在文本周围有一点间距。这是用红色边界框呈现的文本,表示返回的大小 MeasureString
。框和文本的左上角完全相同。
我在 Stack Overflow 上偶然发现 this question,建议使用 StringFormat.GenericTypographic
删除间距。所以我将代码更改为以下内容:
SizeF size = gfx.MeasureString("Hello", myFont, 0, StringFormat.GenericTypographic);
这会产生以下结果(同样,框的左上角和文本是相同的):
近乎完美,但尺寸始终太窄,并且切到最后一个字母。这些结果可以用我尝试过的任何大小的任何字体、任何字符串和任何 width
参数重现。
我目前的解决方法是在绘制文本时将文本向左偏移 5 个像素。我错过了什么?
原来我还必须 使用 StringFormat.GenericTypographic
绘制 字符串,而不仅仅是用它测量。新的 DrawString 调用如下所示:
gfx.DrawString("Hello", myFont, myBrush, topLeft, StringFormat.GenericTypographic);
我正在使用 C# 中的 System.Drawing
库来测量字符串的大小:
SizeF size = gfx.MeasureString("Hello", myFont);
但是,这个 returns 大小在文本周围有一点间距。这是用红色边界框呈现的文本,表示返回的大小 MeasureString
。框和文本的左上角完全相同。
我在 Stack Overflow 上偶然发现 this question,建议使用 StringFormat.GenericTypographic
删除间距。所以我将代码更改为以下内容:
SizeF size = gfx.MeasureString("Hello", myFont, 0, StringFormat.GenericTypographic);
这会产生以下结果(同样,框的左上角和文本是相同的):
近乎完美,但尺寸始终太窄,并且切到最后一个字母。这些结果可以用我尝试过的任何大小的任何字体、任何字符串和任何 width
参数重现。
我目前的解决方法是在绘制文本时将文本向左偏移 5 个像素。我错过了什么?
原来我还必须 使用 StringFormat.GenericTypographic
绘制 字符串,而不仅仅是用它测量。新的 DrawString 调用如下所示:
gfx.DrawString("Hello", myFont, myBrush, topLeft, StringFormat.GenericTypographic);