2008-09-23 176 views
16

我在C++中使用GDI +。 (这个问题也可能存在于C#中)。MeasureString()填充左侧和右侧的文本

我注意到,无论何时我调用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; 

回答

6

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

TextRenderer class是为了这个目的,并与真正的尺寸。看到这个link from msdn的演练使用这个。

+0

使用TextRenderer类可以获得更好的结果。 – Bitterblue 2013-12-02 15:01:51

+0

TextRenderer正是我在类似情况下所需要的 – Rob 2014-07-30 10:45:36

0

TextRenderer非常适合获取字体的大小。但是在绘制循环中,与graphics.DrawString()相比,使用TextRenderer.DrawText令人难以忍受。

由于字符串的宽度是问题,你的好得多使用TextRenderer.MeasureText和graphics.DrawString的组合..

5

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

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

应用与DrawString相同的属性。