Вычисление минимальной ширины, необходимой для отображения текста в X строках, в .Net? - PullRequest
0 голосов
/ 11 ноября 2008

Как рассчитать минимальную ширину, необходимую для отображения строки в X строках, учитывая, что текст должен разбиваться на пробел?

Ответы [ 2 ]

1 голос
/ 11 ноября 2008

Возможный совет: возможно, какой-то бинарный поиск с использованием Graphics.MeasureString ()?

0 голосов
/ 11 ноября 2008

Редактировать: Не понял, что вы хотите, чтобы попытаться поместить текст в фиксированное количество строк. Это было сложно решить. Это лучшее, что я могу придумать, и, возможно, не самое элегантное, но, похоже, оно работает:

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);
...