当System.Windows.Forms.GroupBox的文本换行时,我该如何判断?

3
我正在运行时创建一个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。(a需要29个并且宽度约为180,O需要22个并且宽度约为189)
有人有什么想法吗?(黑客、WinAPI等都可以成为解决方案)
3个回答

2

这段代码是从参考源中派生而来的,它应该非常接近原始代码。当显示多行文本时,它返回添加到文本高度的像素数:

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

0

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

在大多数情况下,标题应该不会有很多文本。考虑在分组框下添加一个标签,以提供更详细的信息。记住,分组框的作用是“分组”相似的控件。因此,实际分组框上的文本应该最小化并模拟标题。


0
为什么不针对您的问题使用布局管理器呢?布局管理器以一种使您免于进行这些计算的方式在容器上布置控件。您可以从像DevXpress和Syncfusion这样的供应商那里找到布局管理器。我认为在.Net Framework中也有布局管理器。

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