Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将Windows窗体文本框文本宽度与GDI宽度关联_C#_Gdi_Textrenderer - Fatal编程技术网

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

C# 将Windows窗体文本框文本宽度与GDI宽度关联,c#,gdi,textrenderer,C#,Gdi,Textrenderer,我使用GDI从文本框中绘制文本;然而,我正在尝试创建文本框,以便它反映与我在GDI中绘制的相同的空间量。因此,对于GDI中的某些X宽度,我希望文本框中字符串的长度不能超过这个宽度 要在GDI中绘制字符串,我将使用以下命令: Font font = new Font("Lucidia Console", 8, GraphicsUnit.Point); StringFormat sf = (StringFormat)StringFormat.GenericTypographic.Clone(); g

我使用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大小/像素比和其他主题的讨论,但几乎没有解决


有什么想法吗?

您可以使用该方法,您可以在
系统.Drawing.Graphics
实例中找到。

您可以使用该方法,您可以在
系统.Drawing.Graphics
实例中找到。

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

TextRenderer.MeasureText使用GDI

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

有一种Graphics.MeasureString方法与Graphics.DrawString兼容,但我从未让它表现出一致性。不过,它可能足以满足您的需要,值得一试

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


另一种选择是使用TextRenderer.DrawText渲染文本。这确实有效,并且与textrender.MeasureText很好地匹配。如果你正在进行大量的测量,尽管它可能有点慢。

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

TextRenderer.MeasureText使用GDI

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

有一种Graphics.MeasureString方法与Graphics.DrawString兼容,但我从未让它表现出一致性。不过,它可能足以满足您的需要,值得一试

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


另一种选择是使用TextRenderer.DrawText渲染文本。这确实有效,并且与textrender.MeasureText很好地匹配。如果你做了很多测量,虽然速度可能有点慢。

从你的问题中不完全清楚你是否遇到了这样的问题。对不起,如果我指的是显而易见的!我几乎给出了相同的答案,但我自己也不确定问题是什么。对不起,我会尽力澄清的。例如,如果包含要绘制的字符串的layoutRectangle的宽度为100个单位,则我希望文本框不允许大于这100个单位的字符串。我似乎找不到Windows窗体文本框中文本的宽度/单位/etc与GDI中绘制的文本的宽度/单位/etc之间的关系。希望这能解释得更清楚一点。我希望它能像在GDI中找到字符串的with一样简单,然后创建一个如此宽度的文本框。不幸的是,这不起作用。文本框中字符串的宽度(使用相同的字体和我能说的所有东西)和GDI中绘制的相同字符串的宽度不一样。从您的问题中不完全清楚您是否遇到了这个问题。对不起,如果我指的是显而易见的!我几乎给出了相同的答案,但我自己也不确定问题是什么。对不起,我会尽力澄清的。例如,如果包含要绘制的字符串的layoutRectangle的宽度为100个单位,则我希望文本框不允许大于这100个单位的字符串。我似乎找不到Windows窗体文本框中文本的宽度/单位/etc与GDI中绘制的文本的宽度/单位/etc之间的关系。希望这能解释得更清楚一点。我希望它能像在GDI中找到字符串的with一样简单,然后创建一个如此宽度的文本框。不幸的是,这不起作用。文本框中字符串的宽度(使用相同的字体和我能说的所有东西)和GDI中绘制的相同字符串的宽度不一样。