18

我在 C++ 中使用 GDI+。(这个问题也可能存在于 C# 中)。

我注意到,每当我调用 Graphics::MeasureString() 或 Graphics::DrawString() 时,字符串的左右两侧都会填充空格。

例如,如果我使用的是 Courier 字体(不是斜体!)并且我测量“P”我得到 90,但“PP”给我 150。我希望等宽字体给出的宽度正好是“PP”的两倍.

我的问题是:这是预期的还是记录在案的行为,我该如何禁用它?

RectF Rect(0,0,32767,32767);
RectF Bounds1, Bounds2;
graphics->MeasureString(L"PP", 1, font, Rect, &Bounds1);
graphics->MeasureString(L"PP", 2, font, Rect, &Bounds2);
margin = Bounds1.Width * 2 - Bounds2.Width;
4

5 回答 5

12

这是设计使然,该方法不使用实际字形来测量宽度,因此在悬垂的情况下添加了一点填充。

如果您需要更高的准确性, MSDN建议使用不同的方法:

要获取适合布局中相邻字符串的指标(例如,在实现格式化文本时),请使用MeasureCharacterRanges方法或采用StringFormat的MeasureString方法之一,并传递GenericTypographic。此外,确保GraphicsTextRenderingHintAntiAlias

于 2008-09-23T02:10:50.747 回答
6

确实这是设计使然,但是接受答案的链接实际上并不完美。问题是当您真正想要使用的是像素(整数)时,在所有这些方法中使用浮点数。

TextRenderer就是为此目的而设计的,它使用真实的大小。有关使用此链接的演练, 请参阅msdn的此链接。

于 2008-11-12T08:28:42.080 回答
5

追加StringFormat.GenericTypographic将解决您的问题:

graphics->MeasureString(L"PP", 1, font, width, StringFormat.GenericTypographic);

将相同的属性应用于DrawString.

于 2011-12-15T06:20:08.137 回答
1

听起来它也可能与提示有关,基于这篇 kb 文章,为什么使用 GDIPlus 与 GDI 绘制时文本看起来不同

于 2008-09-23T02:13:46.823 回答
0

TextRenderer 非常适合获取字体的大小。但是在绘图循环中,与 graphics.DrawString() 相比,使用 TextRenderer.DrawText 的速度非常慢。

由于字符串的宽度是问题,因此最好结合使用 TextRenderer.MeasureText 和 graphics.DrawString..

于 2008-12-04T21:24:48.257 回答