【发布时间】:2016-06-17 12:21:01
【问题描述】:
我有一些具有多行功能的文本框具有不同的字体大小。现在我想知道这个文本框文本的行高,因为它是一个简单的文本框,所以整个文本框的每个行高都是相同的,因为它不是 RichTextBox。
那么我们可以通过 C# 编程在变量中获取它吗?您可以查看屏幕截图以获取更多信息。
【问题讨论】:
标签: c# .net winforms visual-studio fonts
我有一些具有多行功能的文本框具有不同的字体大小。现在我想知道这个文本框文本的行高,因为它是一个简单的文本框,所以整个文本框的每个行高都是相同的,因为它不是 RichTextBox。
那么我们可以通过 C# 编程在变量中获取它吗?您可以查看屏幕截图以获取更多信息。
【问题讨论】:
标签: c# .net winforms visual-studio fonts
要测量文本,请使用TextRender.MeasureText。
如果对宽度不感兴趣,可以很简单的调用函数:
int textHeight;
using (Graphics g = textBox1.CreateGraphics())
{
textHeight = TextRenderer.MeasureText(g, textBox1.Text, textBox1.Font).Height;
}
如你所说,如果每一行都使用相同的字体(就像 TextBox 一样),那么每一行的高度都相同,所以你可以将高度乘以行数。
但您也可以使用TextRenderer.MeasureText 来确定显示文本所需的宽度和高度。例如:
Size szText;
using (Graphics g = textBox1.CreateGraphics())
{
szText = TextRenderer.MeasureText(g,
textBox1.Text,
textBox1.Font,
textBox1.ClientSize,
TextFormatFlags.Left
| TextFormatFlags.Top
| TextFormatFlags.NoPrefix
| TextFormatFlags.TextBoxControl);
}
(还有一个Graphics.MeasureString方法做的事情很相似。但不要使用它。它测量字符串就好像它是由GDI+绘制的一样,但是内置控件都使用GDI 来绘制他们的文字,所以你需要TextRenderer.MeasureText。)
【讨论】:
textBox1 的顶部边框到文本的总高度意味着我有 4 行文本然后它给了我从textBox1 的顶部边框到第 4 行文本的高度但是什么我的问题是只知道 LineHeight/FontHeight 而不是全文高度。那么现在在代码中更新什么...???
int pixels; using (Graphics g = textBox1.CreateGraphics()) { float points = textBox1.Font.SizeInPoints; pixels = Convert.ToInt16(points * g.DpiX / 72); } MessageBox.Show("myFont size in pixels: " + pixels);
int fontHeight = Convert.ToInt32(textBox1.Font.Size);
感谢您的有用回复@CodyGray,最后我只需对您的代码进行少许编辑,如下所示,并且运行良好。
int lineHeight;
using (Graphics g = textBox1.CreateGraphics())
{
lineHeight = Convert.ToInt32(g.MeasureString("A", textBox1.Font).Height);
}
【讨论】:
Graphics.MeasureString 方法可以做非常相似的事情。但不要使用它。它将字符串测量为如果是用GDI+绘制,但是内置控件都是用GDI来绘制文字,所以需要TextRenderer.MeasureText。”