Полностью оправдать строку текста в C#
Класс StringFormat делает его достаточно простым для выравнивания по левому краю, выравнивания по правому краю или центровки строки текста, но, как ни странно, он не предоставляет метода для полного обоснования строки текста (так что простирается вплоть до левого и правого полей.
В этом примере используется следующий код для рисования отдельной строки полностью обоснованного текста.
// Нарисовать выравниваемый текст в объекте Graphics // в указанном прямоугольнике. private void DrawJustifiedLine(Graphics gr, RectangleF rect, Font font, Brush brush, string text) { // Разбиваем текст на слова. string[] words = text.Split(' '); // Добавим пробел к каждому слову и получим его длину. float[] word_width = new float[words.Length]; float total_width = 0; for (int i = 0; i < words.Length; i++) { // Посмотрим, насколько широко это слово. SizeF size = gr.MeasureString(words[i], font); word_width[i] = size.Width; total_width += word_width[i]; } // Получим дополнительное расстояние между словами. float extra_space = rect.Width - total_width; int num_spaces = words.Length - 1; if (words.Length > 1) extra_space /= num_spaces; // Рисуем слова. float x = rect.Left; float y = rect.Top; for (int i = 0; i < words.Length; i++) { // Рисуем слово. gr.DrawString(words[i], font, brush, x, y); // Перемещение вправо, чтобы нарисовать следующее слово. x += word_width[i] + extra_space; } }
Этот метод разбивает строку текста на слова. Затем он перебирает слова и использует метод MeasureString объекта Graphics для просмотра того, насколько широкое будет каждое слово при рисовании в указанном шрифте.
Метод вычитает полную ширину слов из общей доступной ширины, чтобы увидеть, сколько места осталось. Он делит эту сумму на количество пробелов между словами, чтобы определить, сколько места он должен оставить между каждой парой слов, чтобы текст заполнил нужную область.