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

3

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

由于这是我正在开发的某种增强版 MessageBox,因此应该从具有换行符的字符串提供的文本的高度和宽度中确定 MessageBox 的大小。

目前,我使用以下代码根据要输入的文本确定 MessageBox 的大小。但是您可以看到 MessageBox 已经确定了一个最大尺寸。文本框本身也启用了 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属性默认设置为Both会在屏幕上留下一个不太好看也不需要的禁用滚动条。遗憾的是,Graphics.MeasureString并没有真正帮助我们,因为它并没有考虑WordWrap的行为。

那么,我该如何确定TextBox.Text是否超出了可见区域,需要垂直滚动条呢?

5个回答

2
我会继续使用Graphics.MeasureString,但您需要添加逻辑来模拟换行,通过将结果字符串宽度除以控件宽度(即,计算文本框宽度适合您的字符串宽度)来获取您的行数,然后将字符串高度乘以这个值。
请注意,Graphics.MeasureString并不完全准确,但作为滚动支持的粗略猜测可能足够 - 像往常一样,要测试一下。

1

看起来很简单,使用具有不同功能的RichTextBox,例如仅在需要时显示并且不像普通TextBox那样禁用的Scrollbars

使用RichTextBox,我只需将ScrollBars属性设置为both,它就会正确管理。


1
一些控件具有AutoSize属性,它们会根据内部控件的大小或文本而缩小/扩大,也许您不需要进行计算。

0

Graphics.MeasureString 的其中一个重载使用 width 参数(字符串在像素中的最大宽度)。

因此,使用上面示例中的消息所需的大小可能是:

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

有关其他 Graphics.MeasureString 的重载,请参见:MeasureString overloads (MSDN)


0
我刚遇到了这个问题。我有一个带有文本框的用户控件,我想要它无论最终大小如何都不显示滚动条。(那个特定的用户控件是窗口中的一个面板,窗口可以是纵向或横向的,我不想为每个布局都有两个用户控件--那看起来很愚蠢。)
在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);

这篇论坛帖子建议使用TextRenderer.MeasureText()


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接