2011-12-18 236 views
3

我遇到了Graphics.DrawString()方法的問題。我的UserControl使用等寬字體在面板上繪製,顯然,DrawString()以這種方式格式化文本,使其不再是完全等寬的。我一直在使用中修復這個,希望可以的StringFormat,但沒有成功:使用DrawString()正確繪製文本

StringFormat sf = new StringFormat(StringFormatFlags.NoClip | StringFormatFlags.FitBlackBox | StringFormatFlags.LineLimit | StringFormatFlags.MeasureTrailingSpaces); 

繪製文本代碼:

for (int i = 0; i < document.Text.Count; i++) 
       g.DrawString(document.Text[i], Font, Brushes.Black, new PointF(offset - 2, offset + Font.Height * i), sf); 

例如,繪製在索拉9「eeeeeeee」,當,不時地,兩個e將接近另一個像素1個像素。有沒有辦法正確顯示文本,等寬? (我的實際問題是:我從頭開始製作自己的文本框控件,作爲一個練習和樂趣,實際上它很順利,但是顯示文本的面板應該能夠根據鼠標點擊來定位插入符號由於字體的高度屬性,查找正確的行很容易,但是找到該行中的當前索引不是,對於非等寬字體,我無法想象一種方法來確定插入索引,但是對於等寬字體字體應該是可行的,因爲符號的寬度是固定的,所以,也許有更好的方法來確定這一點?)

親切的問候, Jacco

回答

4

繪製等寬。只是每個字符的寬度不是整數像素 - 每個字符可能是9.9像素寬。 (爲了保持字符清晰,在繪製時將它們對齊到最接近的像素,這就是爲什麼您有時會看到兩個更接近的原因。)

一個選項是使用AntiAlias標誌,該標誌將停止嘗試將每個字符捕捉到最接近的像素 - 它只是灰度 - 模糊邊緣,因此整個間距看起來相對一致。但是,antialising在小字號下看起來不太好。

或者您可以使用TextRenderer而不是Graphics.DrawString。 TextRenderer使用舊的GDI渲染(而不是像Graphics類那樣的GDI +),所以它不會完成子像素渲染 - 每個字符的寬度都是9像素,或者每個字符的寬度都是10像素。有時候,舊技術更好。

+0

AntiAlias標誌使字體看起來對我來說真的很糟糕,即使在12號尺寸下 – 2011-12-18 23:23:55

+0

謝謝!該繪圖現在使用TextRenderer完美工作。使用TextRenderer.MeasureString()進行測量時會出現一些問題。即使在將TextFormatFlags.NoPadding設置爲TextFormatFlags之後,像「abcd」這樣的字符串的測量結果也不正確(寬度爲25,應該是28,Consolas 9),「a」足夠奇怪地給出了10而不是7. – 2011-12-18 23:43:36

+0

我相信您還可以將'graphics.TextRenderingHint'設置爲不同的值,以使其像TextRender一樣繪製文本。我不記得具體的價值,但只有5個左右的選擇。 – 2011-12-19 00:57:50