【问题标题】:How can I tell when the Text of a System.Windows.Forms.GroupBox wraps to the next line?如何判断 System.Windows.Forms.GroupBox 的文本何时换行到下一行?
【发布时间】:2010-03-13 04:56:28
【问题描述】:

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

【问题讨论】:

    标签: c# .net vb.net winforms


    【解决方案1】:

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

        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】:

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

      在大多数情况下,您不应该在组框的标题上放置大量文本。考虑在分组框下方添加一个更详细的标签。请记住,组框旨在“分组”类似的控件。所以实际组框上的文本应该是最少的并且模仿标题。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-06-18
          • 1970-01-01
          • 2021-11-27
          • 1970-01-01
          • 2013-03-18
          • 1970-01-01
          相关资源
          最近更新 更多