如何判断System.Windows.Forms.GroupBox的文本何时换行到下一行?

时间:2010-03-12 19:54:00

标签: c# .net vb.net winforms

我正在运行时创建一个GroupBox并设置其Text属性。通常,文本只在一行上,但有时会包装。问题是GroupBox中包含的控件掩盖了GroupBox的文本。

我想做的是确定文本是否以及何时包装。具体来说,我想确定与单行相比,包装文本占用多少额外高度。这样,我可以重新定位GroupBox的控件并调整其高度。

最初,我以为我会通过调用GroupBox的CreateGraphics()方法并使用Graphics来测量字符串来实现这一点。像这样:

private void SetGroupBoxText(GroupBox grp, string text)
{
    const int somePadding = 10;

    Graphics g = grp.CreateGraphics();
    SizeF textSize = g.MeasureString(text, grp.Font);
    if (textSize.Width > (grp.Width - somePadding))
    {
        // Adjust height, etc.
    }
}

问题是g.MeasureString(text, grp.Font)生成的大小似乎不准确。我确定通过放置足够的单个字符来引起包裹,然后测量结果字符串是不准确的。

例如,在发生换行之前需要86个管道(|)。当我测量那根弦时,它的宽度是~253。它需要16个大写的W才能强制换行 - 它的字符串宽度为~164。这是我测试的两个极端。我的GroupBox的宽度是189.(一个是29,宽度是180,O是22,宽度是~189)

有没有人有任何想法? (黑客,WinAPI等是受欢迎的解决方案)

3 个答案:

答案 0 :(得分:2)

此代码源自Reference Source,它应该非常接近。当它显示多行文本时,它返回添加到文本高度的像素数:

    public static int GetGroupboxTextHeightExtra(GroupBox box) {
        TextFormatFlags flags = TextFormatFlags.Default | TextFormatFlags.TextBoxControl | TextFormatFlags.WordBreak | TextFormatFlags.PreserveGraphicsTranslateTransform | TextFormatFlags.PreserveGraphicsClipping;
        Rectangle rc = new Rectangle(0, 0, box.Width - 2 * 7, box.Height);
        Size size;
        using (Graphics gr = Application.OpenForms[0].CreateGraphics()) {
            size = TextRenderer.MeasureText(gr, box.Text, box.Font, rc.Size, flags);
        }
        return size.Height - box.Font.Height;
    }

答案 1 :(得分:0)

我知道这不能直接解决您的问题,但您可以尝试将组框的最小大小设置为您知道文本不会包装的某个数字。

在大多数情况下,您不应该在组框的标题上包含大量文本。考虑在组框下面添加一个更详细的标签。请记住,组框意味着“分组”类似的控件。因此,实际组框中的文本应该是最小的并且模仿标题。

答案 2 :(得分:0)

为什么不为您的问题使用布局管理器?布局管理器布局控制容器,使您无需进行这些计算。您可以从DevXpress和Syncfusion等供应商处找到布局管理器。我认为.Net Framework中也有布局管理器。