【问题标题】:How To Get LineHeight/FontHeight In MultiLine TextBox Using C#?如何使用 C# 在多行文本框中获取 LineHeight/FontHeight?
【发布时间】:2016-06-17 12:21:01
【问题描述】:

我有一些具有多行功能的文本框具有不同的字体大小。现在我想知道这个文本框文本的行高,因为它是一个简单的文本框,所以整个文本框的每个行高都是相同的,因为它不是 RichTextBox。

那么我们可以通过 C# 编程在变量中获取它吗?您可以查看屏幕截图以获取更多信息。

【问题讨论】:

    标签: c# .net winforms visual-studio fonts


    【解决方案1】:

    要测量文本,请使用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);
    【解决方案2】:

    感谢您的有用回复@CodyGray,最后我只需对您的代码进行少许编辑,如下所示,并且运行良好。

    int lineHeight;
    using (Graphics g = textBox1.CreateGraphics())
    {
        lineHeight = Convert.ToInt32(g.MeasureString("A", textBox1.Font).Height);
    }
    

    【讨论】:

    • 正如我的答案底部所述,这是错误的解决方案:“还有一个Graphics.MeasureString 方法可以做非常相似的事情。但不要使用它。它将字符串测量为如果是用GDI+绘制,但是内置控件都是用GDI来绘制文字,所以需要TextRenderer.MeasureText。”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-22
    相关资源
    最近更新 更多