2008-09-23 128 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相同的屬性。