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

问题描述:

我使用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 /像素比率和其他主题的各种讨论,但没有什么决心。

任何想法?

您可以使用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

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

TextRenderer.MeasureText使用GDI。

它们是2种不同的文本渲染模型,所以你不会得到期望的结果。

有一个Graphics.MeasureString方法与Graphics.DrawString兼容,但我从来没有得到它的行为一致。它可能足够满足您的需求,但值得一试。

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

您的另一种选择是使用TextRenderer.DrawText来呈现文本。这实际上工作,并与TextRenderer.MeasureText很好地匹配。如果您正在进行大量测量,但速度可能会很慢。