c# - gdi+ - Graphics.MeasureString 太宽或太窄

标签 c# gdi+ system.drawing drawstring

我正在使用 C# 中的 System.Drawing 库来测量字符串的大小:

SizeF size = gfx.MeasureString("Hello", myFont);

但是,这会返回文本周围有一点间距的大小。下面是用红色边界框呈现的文本,表示返回的大小 MeasureString。框和文本的左上角是完全相同的点。

Hello with a spacious bounding box

我偶然发现了 this question在 Stack Overflow 上,建议使用 StringFormat.GenericTypographic 删除间距。所以我将代码更改为以下内容:

SizeF size = gfx.MeasureString("Hello", myFont, 0, StringFormat.GenericTypographic);

这会产生以下结果(同样,框的左上角和文本是相同的):

Hello without spacing but the bounding box cuts into the text

近乎完美,但尺寸始终太窄并切入最后一个字母。这些结果可以用我尝试过的任何大小的任何字体、任何字符串和任何 width 参数重现。

我目前的解决方法是在绘制文本时将文本向左偏移 5 个像素。我错过了什么?

最佳答案

原来我还必须使用StringFormat.GenericTypographic绘制字符串,而不仅仅是用它来测量。新的 DrawString 调用如下所示:

gfx.DrawString("Hello", myFont, myBrush, topLeft, StringFormat.GenericTypographic);

关于c# - gdi+ - Graphics.MeasureString 太宽或太窄,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65559919/

相关文章:

c# - 为非托管 (C++) 代码编写托管包装器 - 自定义类型/结构

c# - 如何解析HTML修改所有单词

c# - 选择“与 PHP 相同”时更改 MySQL C# 默认日期格式

c# - 在窗口内绘图不会重绘和涂抹

c# - C# 和远程桌面问题的屏幕截图

.net - 使用Shapes派生对象代替Visual派生对象造成的性能下降有多大

C# 发送群发邮件

c# - 使用 FillPath 创建带孔的多边形

c# - 在轨迹栏 ValueChanged 上触发事件,但不在代码中

c# - 流式传输桌面的最快方法是什么?