Полностью обосновать абзацы текста в C#

Класс StringFormat делает его достаточно простым для выравнивания по левому краю, выравнивания по правому краю или центровки строки текста, но, как ни странно, он не предоставляет метода для полного обоснования строки текста (так что простирается вплоть до левого и правого полей. В этом примере показано, как вы можете полностью обосновать абзацы текста.

Следующий метод DrawParagraphs рисует абзацы с правильным выравниванием.

// Нарисовать выравниваемый текст на графике
// объект в указанном прямоугольнике.
private RectangleF DrawParagraphs(Graphics gr, RectangleF rect,
    Font font, Brush brush, string text,
    TextJustification justification, float line_spacing,
    float indent, float paragraph_spacing)
{
    // Разделите текст на абзацы.
    string[] paragraphs = text.Split('\n');

    // Рисуем каждый абзац.
    foreach (string paragraph in paragraphs)
    {
        // Нарисуем абзац, отслеживая оставшееся пространство.
        rect = DrawParagraph(gr, rect, font, brush,
            paragraph, justification, line_spacing,
            indent, paragraph_spacing);

        // Смотрите, осталось ли место.
        if (rect.Height < font.Size) break;
    }

    return rect;
}

Этот код разбивает текст на абзацы и вызывает следующий DrawParagraph для рисования каждого из них. После того, как он рисует абзац, он сравнивает высоту оставшегося прямоугольника с размером шрифта. Если нет места для рисования текста, метод возвращается.

private RectangleF DrawParagraph(Graphics gr, RectangleF rect,
    Font font, Brush brush, string text,
    TextJustification justification, float line_spacing,
    float indent, float extra_paragraph_spacing)
{
        float y = rect.Top;

        string[] words = text.Split(' ');
    int start_word = 0;

        for (; ; )
    {
                        string line = words[start_word];

                int end_word = start_word + 1;
        while (end_word < words.Length)
        {
                        string test_line = line + " " + words[end_word];
            SizeF line_size = gr.MeasureString(test_line, font);
            if (line_size.Width > rect.Width)
            {
                                end_word--;
                break;
            }
            else
            {
                                line = test_line;
            }

                        end_word++;
        }

                if ((end_word == words.Length) &&
            (justification == TextJustification.Full))
        {
                        DrawLine(gr, line, font, brush,
                rect.Left + indent,
                y,
                rect.Width - indent,
                TextJustification.Left);
        }
        else
        {
                        DrawLine(gr, line, font, brush,
                rect.Left + indent,
                y,
                rect.Width - indent,
                justification);
        }

                y += font.Height * line_spacing;

                if (font.Size > rect.Height) break;

                start_word = end_word + 1;
        if (start_word >= words.Length) break;

                indent = 0;
    }

        y += font.Height * extra_paragraph_spacing;

            float height = rect.Bottom - y;
    if (height < 0) height = 0;
    return new RectangleF(rect.X, y, rect.Width, height);
}

Этот метод разбивает абзац на слова и вводит цикл для обработки слов. Цикл продолжается до тех пор, пока метод не закончится из слов или не выйдет из пространства, чтобы нарисовать их.

Каждый раз через цикл код строит строку, добавляя больше слов, пока строка больше не будет соответствовать доступной ширине. Затем он удаляет последнее слово, чтобы строка соответствовала.

Если строка содержит все остальные слова, и если программа полностью оправдывает текст, то метод вызывает DrawLine, чтобы левая оправдала эту строку. (Когда вы полностью оправдываете текст, вы не оправдываете окончательную строку. Представьте себе, насколько странно было бы, если бы последняя строка содержала только два слова. У вас было бы первое слово в крайнем левом углу, огромное пространство, а второе слово на крайнем правом.)

Если это не конец абзаца, или программа не полностью оправдывает текст, тогда метод вызывает DrawLine, чтобы нарисовать строку с желаемым обоснованием.

В следующем коде показан метод DrawLine.

// Нарисуем строку текста.
private void DrawLine(Graphics gr, string line, Font font,
    Brush brush, float x, float y, float width,
    TextJustification justification)
{
    // Сделайте прямоугольник для удержания текста.
    RectangleF rect = new RectangleF(x, y, width, font.Height);

    // Посмотрим, следует ли использовать полное обоснование.
    if (justification == TextJustification.Full)
    {
        // Обоснуем текст.
        DrawJustifiedLine(gr, rect, font, brush, line);
    }
    else
    {
        // Создаем StringFormat для выравнивания текста.
        using (StringFormat sf = new StringFormat())
        {
            // Используйте соответствующее выравнивание.
            switch (justification)
            {
                case TextJustification.Left:
                    sf.Alignment = StringAlignment.Near;
                    break;
                case TextJustification.Right:
                    sf.Alignment = StringAlignment.Far;
                    break;
                case TextJustification.Center:
                    sf.Alignment = StringAlignment.Center;
                    break;
            }

            gr.DrawString(line, font, brush, rect, sf);
        }
    }
}

Этот метод сначала проверяет параметр justification. Если justification является Full, метод вызывает метод DrawJustifiedLine, чтобы полностью выровнять текст. См. Сообщение Полностью оправдайте строку текста в C# для информации о том, как работает этот метод.

Если justification не Full, метод делает объект StringFormat с правильным выравниванием и использует его для рисования текста. р>

Источник: http://csharphelper.com/blog/2014/10/fully-justify-paragraphs-of-text-in-c/

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (1 оценок, среднее: 5,00 из 5)
Adblock
detector