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

时间:2010-07-13 13:32:01

标签: c# winforms

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

由于它是我工作的某种增强型MessageBox,因此MessageBox的大小应根据文字的高度和宽度来确定,其中字符串中包含换行符。< / p>

目前,我使用此代码来确定MessageBox的大小,具体取决于要输入的文本。但是您看到MessageBox确定了MaximiumSize。文本本身的TextBox也启用了WordWrap。因此,唯一未定义的是将文本插入TextBox.Text后的Height文本。

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并没有真正帮助,因为它没有考虑WordWrap行为。

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

5 个答案:

答案 0 :(得分:2)

我会继续使用Graphics.MeasureString,但您需要添加逻辑,通过将结果字符串宽度除以控件宽度来模拟自动换行(即,您计算文本框宽度如何适合您的字符串宽度)获取你的行然后用它来填充字符串高度。

但请注意,Graphics.MeasureString并不完全准确,但是对于滚动支持的粗略猜测它可能就足够了 - 一如既往地测试它。

答案 1 :(得分:1)

看起来非常简单,使用具有完全不同功能的RichTextBox,例如Scrollbars只会在需要时显示,而不会像普通TextBox那样显示为禁用。

使用RichTextBox,我可以将ScrollBars属性设置为两者,然后就可以正确管理。

答案 2 :(得分:1)

某些控件的AutoSize属性会根据内部或文本的控件大小缩小/增长,也许您不需要计算。

答案 3 :(得分:0)

Graphics.MeasureString重载之一采用width参数,(字符串的最大宽度,以像素为单位)。

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

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

对于其他Graphics.MeasureString重载,请参阅:MeasureString overloads (MSDN)

答案 4 :(得分:0)

我刚遇到这个问题。我有一个带有文本框的UserControl我想要显示没有滚动条,无论它的大小如何。 (特定的用户控件是窗口中的窗格,窗口可以是纵向或横向,我不希望每个布局都有两个用户控件 - 看起来很愚蠢。)

这个代码在Load事件处理程序中为我做了:

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()