【问题标题】:Correlating Windows forms textbox text width to GDI width将 Windows 窗体文本框文本宽度与 GDI 宽度相关联
【发布时间】:2009-11-03 21:32:26
【问题描述】:

我正在使用 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 ratios 和其他主题的各种讨论,但几乎没有解决。

有什么想法吗?

【问题讨论】:

    标签: c# gdi textrenderer


    【解决方案1】:

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

    TextRenderer.MeasureText 使用 GDI。

    它们是 2 种不同的文本渲染模型,因此您不会得到想要的结果。

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

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

    您的另一种选择是使用 TextRenderer.DrawText 来呈现文本。这实际上确实有效,并且与 TextRenderer.MeasureText 很好地匹配。如果您要进行大量测量,虽然它可能会有点慢。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 您的问题并不完全清楚您是否遇到了这个问题。对不起,如果我指出显而易见的!
      • 我几乎给出了相同的答案,但我不确定自己的问题是什么。
      • 对不起,我会尽力澄清。例如,如果包含我要绘制的字符串的 layoutRectangle 宽度为 100 个单位,那么我希望我的文本框不允许大于这 100 个单位的字符串。我似乎无法找到 Windows 窗体文本框中文本的宽度/单位/等与 GDI 中绘制的文本的宽度/单位/等之间的关系。希望这能解释得更多。
      • 我希望它就像在 GDI 中找到我的字符串的 with 一样简单,然后创建一个该宽度的文本框。不幸的是,这不起作用。文本框中字符串的宽度(使用相同的字体和我所知道的所有内容)和在 GDI 中绘制的相同字符串的宽度不一样。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-14
      • 1970-01-01
      • 2012-07-11
      • 2013-03-22
      相关资源
      最近更新 更多