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

C# 如何判断System.Windows.Forms.GroupBox的文本何时换行到下一行?,c#,.net,vb.net,winforms,C#,.net,Vb.net,Winforms,我正在运行时创建一个GroupBox并设置其文本属性。通常,文本仅在一行上,但有时会换行。问题是GroupBox中包含的控件掩盖了GroupBox的文本 我想做的是确定文本是否换行以及何时换行。具体地说,我想确定与一行文字相比,被包装的文字所占的额外高度。这样,我可以重新定位GroupBox的控件并调整其高度 最初,我想我应该调用GroupBox的CreateGraphics()方法,并使用图形来测量字符串。大概是这样的: private void SetGroupBoxText(GroupBo

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

我想做的是确定文本是否换行以及何时换行。具体地说,我想确定与一行文字相比,被包装的文字所占的额外高度。这样,我可以重新定位GroupBox的控件并调整其高度

最初,我想我应该调用GroupBox的
CreateGraphics()
方法,并使用图形来测量字符串。大概是这样的:

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。这是我测试的两个极端。我的分组框的宽度是189。(a的尺寸为29,宽度约为180;O的尺寸为22,宽度约为189)


有人有什么想法吗?(黑客、WinAPI等都是受欢迎的解决方案)

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


在大多数情况下,分组框的标题上不应该有很多文本。考虑在组框下方添加一个标签,以了解更多细节。请记住,分组框用于“分组”类似的控件。因此,实际分组框上的文本应该是最小的,并模仿标题。

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

    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;
    }

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