我在运行时创建一个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等是受欢迎的解决方案)

最佳答案

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

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

关于c# - 我如何知道System.Windows.Forms.GroupBox的文本何时换行到下一行?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2435431/

10-11 17:49