代码之家  ›  专栏  ›  技术社区  ›  Kevin Vaughan

如何获取文本框中显示文本的大小

  •  3
  • Kevin Vaughan  · 技术社区  · 15 年前

    我需要一种方法来确定多栏中显示文本的大小 TextBox 设置 Scrollbars 属性设置为正确的值。

    因为它是某种增强的 MessageBox 我在做什么,大小 对话框 应该根据文本的高度和宽度来确定,这些文本由包含换行符的字符串提供。

    目前我使用此代码来确定 对话框 取决于要输入的文本。但是你看到了 对话框 有一个 MaximiumSize 确定的。文本本身的文本框具有 WordWrap 也启用了。所以唯一未定义的是 Height 在将文本插入textbox.text之后。

    SizeF textSize = this.tbxText.CreateGraphics().MeasureString(message, this.tbxText.Font);
    
    int frmWidth = picWidth + (int)textSize.Width;
    if (frmWidth > this.MaximumSize.Width)
    {
        frmWidth = this.MaximumSize.Width;
    }
    else if (frmWidth < this.MinimumSize.Width)
    {
        frmWidth = this.MinimumSize.Width;
    }
    
    int frmHeight = picHeight + (int)textSize.Height + pnlButtons.Height + pnlInput.Height;
    if (frmHeight > this.MaximumSize.Height)
    {
        frmHeight = this.MaximumSize.Height;
    }
    else if (frmHeight < this.MinimumSize.Height)
    {
        frmHeight = this.MinimumSize.Height;
    }
    

    设置 TextBox.Scrollbars 属性设置为“两者都是默认值”时,会在屏幕上显示一个禁用的滚动条,该滚动条不是很好也不需要。 可悲的是, Graphics.MeasureString 真的没有帮助,因为它没有考虑 词绕转 行为。

    那么,我如何确定 TextBox.Text 离开可见区域是否需要垂直滚动条?

    5 回复  |  直到 8 年前
        1
  •  2
  •   Adam Houldsworth    15 年前

    我会继续使用 Graphics.MeasureString ,但您需要添加逻辑,通过将生成的字符串宽度除以控件宽度(即,计算文本框宽度在字符串宽度中的大小)来模拟换行符,以获取行,然后将字符串高度乘以此值。

    然而,请注意graphics.measurestring并不完全准确,但是作为对滚动支持的粗略猜测,它可能就足够了-一如既往,测试一下。

        2
  •  1
  •   Kevin Vaughan    15 年前

    似乎很简单,使用 RichTextBox 它有非常不同的特性,例如 Scrollbars 仅在需要时显示,而不是像正常情况下一样禁用显示 TextBox .

    多格式文本框 我可以设置 ScrollBars 财产归两者所有,它将管理这项权利。

        3
  •  1
  •   shanif    13 年前

    有些控件具有AutoSize属性,这些属性根据控件内部的大小或文本进行收缩/增长,也许您不需要计算。

        4
  •  0
  •   Alon Brontman    13 年前

    什么之中的一个 Graphics.MeasureString 重载需要 width 参数(字符串的最大宽度,以像素为单位)。

    因此,在上面的示例中呈现消息所需的大小可能是:

    SizeF textSize = this.tbxText.CreateGraphics()
        .MeasureString(message, this.tbxText.Font, this.tbxText.Width);
    ...
    

    为他人 图形.测量 重载,见: MeasureString overloads (MSDN)

        5
  •  0
  •   ulatekh    12 年前

    我刚碰到这个问题。我有一个用户控件,它有一个文本框,我想不显示滚动条,不管滚动条的大小。(特定的用户控件是窗口中的一个窗格,窗口可以是纵向的,也可以是横向的,我不希望每个布局都有两个用户控件——这看起来很愚蠢。)

    在加载事件处理程序中,这段代码是为我做的:

    int iLine = textbox1.GetLineFromCharIndex(textbox1.TextLength - 1) + 1;
    int iHeight = TextRenderer.MeasureText(this.textbox1.Text, this.textbox1.Font).Height;
    float fTextHeight = iHeight * ((float)iLine + 0.25f /* fudge factor */);
    textbox1.Size = new Size (textbox1.Size.Width, (int)fTextHeight);
    

    This forum post 建议使用 TextRenderer.MeasureText() .