关联Windows将文本框文本宽度与GDI宽度相关联

时间:2009-11-03 21:32:27

标签: c# gdi textrenderer

我正在使用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中绘制的宽度相同。

我遇到过关于字形,大小/像素比率和其他主题的各种讨论,但几乎没有决心。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

g.DrawString使用GDI +在屏幕上绘制文字。

TextRenderer.MeasureText使用GDI。

它们是两种不同的文本渲染模型,因此您无法获得所需的结果。

有一个Graphics.MeasureString方法与Graphics.DrawString兼容,但我从来没有让它表现得一致。虽然它可能足以满足您的需求,但值得一试。

此外,还有一篇关于CodeProject的文章,他们将文本绘制到位图上并从位图上取下测量值以获得精确的大小。我不记得具体细节,但不应该很难找到。这篇文章是关于在.net only代码中创建一个类似控件的文本框。

您的另一种选择是使用TextRenderer.DrawText来呈现文本。这确实有效,并与TextRenderer.MeasureText很好地匹配。如果你做了很多测量,虽然它可能有点慢。

答案 1 :(得分:0)

您可以使用MeasureString方法,您可以在System.Drawing.Graphics个实例中找到该方法。