2009-11-03 65 views
1

我使用GDI從文本框中繪製文本;不過,我正在嘗試創建我的文本框,以便它反映出我在GDI中繪製的空間量相同。所以,對於GDI中的一些X寬度,我希望文本框中字符串的長度不能超過這個寬度。將Windows窗體文本框文本寬度與GDI寬度相關聯

要繪製在GDI字符串,我使用了以下內容:

Font font = new Font("Lucidia Console", 8, GraphicsUnit.Point); 
StringFormat sf = (StringFormat)StringFormat.GenericTypographic.Clone(); 
g.DrawString(textFromTextbox, font, Brush, layoutRect, sf); 

至於文本框,我衡量的字符輸入的字符串:

Font font = new Font("Lucidia Console", 8, GraphicsUnit.Point); 
Size lineSize = TextRenderer.MeasureText(textbox.Text, font); 
Size charSize = TextRenderer.MeasureText(e.KeyChar.ToString(), font); 

if(charSize + lineSize > MAX_LINE_SIZE) 
//Other stuff;

我有文本框本身也使用Lucidia Console 8pt作爲字體。

那麼,麻煩就變成了一個X寬度的文本框,它的寬度與我在GDI中繪製的寬度相同。

我已經遇到過關於字形,em-size /像素比率和其他主題的各種討論,但沒有什麼決心。

任何想法?

回答

0

您可以使用MeasureString方法,您可以在System.Drawing.Graphics實例中找到該方法。

+0

從你的問題來看,這是不是完全清楚你是否有這個問題。對不起,如果我指出顯而易見的! – GraemeF 2009-11-03 21:54:01

+0

我幾乎給出了同樣的答案,但我不確定自己的問題是什麼。 – 2009-11-03 21:56:11

+0

對不起,我會盡力澄清。 例如,如果將包含我要繪製的字符串的layoutRectangle爲100個單位寬,那麼我希望我的文本框不允許大於100個單位的字符串。 我似乎無法找到一個Windows窗體文本框內的文本的寬度/單位/等,以及在GDI中繪製的文本的寬度/單位等等之間的關係。 希望這可以解釋一點。 – Jesse 2009-11-03 22:06:33

1

g.DrawString使用GDI +在屏幕上繪製文本。

TextRenderer.MeasureText使用GDI。

它們是2種不同的文本渲染模型,所以你不會得到期望的結果。

有一個Graphics.MeasureString方法與Graphics.DrawString兼容,但我從來沒有得到它的行爲一致。它可能足夠滿足您的需求,但值得一試。

此外CodeProject上還有一篇文章,他們將文本繪製到位圖上,並從位圖上取下測量值以獲取確切的大小。我不記得具體細節,但不應該很難找到。這篇文章是關於創建一個像.net代碼中的控件一樣的文本框。

您的另一種選擇是使用TextRenderer.DrawText來呈現文本。這實際上工作,並與TextRenderer.MeasureText很好地匹配。如果您正在進行大量測量,但速度可能會很慢。