2012-10-31 10 views
2

我想使用Graphics.DrawString繪製使用單獨的顏色的字符。如何給單個字符上色並保持適當的間距/字距/對齊?

問題是,每次我調用DrawString時,我都必須知道相對於其他字符的位置(使用Point或Rectangle)。

考慮到在帶有StringFormat的矩形中使用DrawString時發生的字距和纏繞,這幾乎是可能的。 StringFormat對於指定對齊,包裝,修整等很重要。

理想情況下,我可以告訴DrawString如何爲每個字符單獨着色。另一種選擇是,如果我可以使用StringFormat在矩形中測量字符串,然後檢索每個字符索引的X和Y位置,以便我可以使用它自己的畫筆繪製每個字符。

我試着單獨測量每個字符,但這不起作用,因爲字符串中的字符組合與每個字符測量的寬度不一樣。

編輯: 這裏是正在發生的事情,當我需要一個字符串,使區域陣列,紅色和藍色交替填補這些地區,然後嘗試繪製這些地區的每一個個性:

enter image description here

我打電話的DrawString如下:

g.DrawString(character, font, brush, region.GetBounds(g)); 

也試過如下:

Rectangle bounds = Region.GetBounds(g); 
g.DrawString(character, font, brush, new PointF(bounds.Left, bounds.Top)); 

而且,

g.DrawString(character, font, brush, region.GetBounds(g), stringFormat); 

相同的結果。

+0

與gdi +,你可以_measure_字符串。因此您可以通過測量切割到該字符的字符串來檢查下一個字符必須出現在哪裏。那麼您可以逐個輸出字符。或者你可以使用Graphics.MeasureCharacterRanges來獲取每個字符的位置 – Vlad

+0

我嘗試過使用MeasureCharacterRanges,但我似乎無法畫出使用這些區域的每個字符。如果我在它應該進入的區域使用DrawString繪製每個字符,則該區域太小並剪裁該字符。 –

+0

用我的結果編輯我的問題。 –

回答

2

GDI +的DrawString填充瞭解釋您獲得的左偏移量的結果。

嘗試使用GDI來測量字符串。幸運的是,這是實現和易於通過TextRenderer()對象,f.ex從.net達到:

Size sz = TextRenderer.MeasureText(character, 
            font, 
            new Point(Integer.MaxValue, Integer.MaxValue), 
            TextFormatFlags.NoPadding); 

您還可以查看到TextRenderer.DrawText()

當然,您始終可以修改您的StringFormat實例以使用中心對齊方式,並使用矩形而不是點來代替DrawString

StringFormat sf = new StringFormat(); 
sf.Alignment = StringAlignment.Center; 
Rectangle cr = new Rectangle(x, y, w, h); //same as the colored region 
g.DrawString(character, font, brush, cr, sf); 

希望這會有所幫助。

+0

我使用了StringAlignment。在MeasureCharacterRanges提供的矩形中繪製每個字符時居中,並且工作正常。 –

+0

'TextRenderer.DrawText()'適用於我的目的。 – sjlewis