簡體   English   中英

將Windows窗體文本框文本寬度與GDI寬度相關聯

[英]Correlating Windows forms textbox text width to GDI width

我正在使用GDI從文本框中繪制文本; 但是,我試圖創建我的文本框,使其反映出與GDI中相同的空間。 因此,對於GDI中某些X寬度的寬度,我希望文本框中字符串的長度不能超過該寬度。

為了在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 / pixel比率和其他主題的各種討論,但是解決的很少。

有任何想法嗎?

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

TextRenderer.MeasureText使用GDI。

它們是2種不同的文本呈現模型,因此您將無法獲得理想的結果。

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

另外,前段時間有一篇關於CodeProject的文章,他們將文本繪制到位圖上,並從位圖上進行了測量,以獲取准確的大小。 我不記得具體細節,但不難發現。 本文是關於在僅.net代碼中創建類似控件的文本框的。

您的另一種選擇是使用TextRenderer.DrawText呈現文本。 這確實有效,並且可以與TextRenderer.MeasureText很好地匹配。 如果您要進行大量測量,雖然速度可能會很慢。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM