代码之家  ›  专栏  ›  技术社区  ›  fre0n

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

  •  3
  • fre0n  · 技术社区  · 16 年前

    我正在运行时创建一个GroupBox并设置它的Text属性。通常,文本只在一行上,但有时会换行。问题是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。这是我测试的两个极端。我的GroupBox的宽度是189。(a取29,宽度约为180;O取22,宽度约为189)

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

    3 回复  |  直到 16 年前
        1
  •  2
  •   Hans Passant    16 年前

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

        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;
        }
    
        2
  •  0
  •   Icono123    16 年前

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

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

        3
  •  0
  •   Ikaso    16 年前

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