【问题标题】:Calculating the minimum width needed to show text in X lines, in .Net?计算在.Net中以X行显示文本所需的最小宽度?
【发布时间】:2008-11-10 23:24:49
【问题描述】:

如果文本应该在空白处中断,您如何计算在 X 行中显示字符串所需的最小宽度?

【问题讨论】:

  • 等宽​​字体还是等比例字体?

标签: c# .net string graphics


【解决方案1】:

可能的提示:也许是某种使用 Graphics.MeasureString() 的二分搜索?

【讨论】:

    【解决方案2】:

    编辑:没有意识到您想尝试将文本调整到固定的行数。这是一个很难尝试解决的问题。这是我能想到的最好的,可能不是最优雅的,但它似乎有效:

    public SizeF CalculateWidth(Font font, Graphics graphics, int numOfLines,
                                string text)
    {
        SizeF sizeFull = graphics.MeasureString(text, font,
                                                new SizeF(
                                                    float.PositiveInfinity,
                                                    float.PositiveInfinity),
                                                StringFormat.
                                                    GenericTypographic);
    
        float width = sizeFull.Width/numOfLines;
        float averageWidth = sizeFull.Width/text.Length;
        int charsFitted;
        int linesFilled;
    
        SizeF needed = graphics.MeasureString(text, font,
                                              new SizeF(width,
                                                        float.
                                                            PositiveInfinity),
                                              StringFormat.
                                                  GenericTypographic,
                                              out charsFitted,
                                              out linesFilled);
    
        while (linesFilled > numOfLines)
        {
            width += averageWidth;
            needed = graphics.MeasureString(text, font,
                                            new SizeF(width,
                                                      float.PositiveInfinity),
                                            StringFormat.GenericTypographic,
                                            out charsFitted, out linesFilled);
        }
    
        return needed;
    }
    

    示例用法:

    Font font = new Font("Arial", 12, FontStyle.Regular,
                         GraphicsUnit.Pixel);
    Graphics g = Graphics.FromImage(new Bitmap(1, 1));
    string text = "Some random text with words in it.";
    
    SizeF size = CalculateWidth(font, g, 3, text);
    

    【讨论】:

    • 假设您只想要一行中的 1 个单词。
    猜你喜欢
    • 1970-01-01
    • 2011-05-04
    • 2022-08-19
    • 1970-01-01
    • 2011-10-18
    • 1970-01-01
    • 2010-12-07
    • 1970-01-01
    • 2019-05-22
    相关资源
    最近更新 更多