Подход прост в концепции, немного вовлечен в исполнение. Он включает всего несколько шагов:
Split the text into lines that will fit horizontally
Compute the vertical position of the first line
for each line
Compute its width and the X position
Display it at the Y position
Add the line height to the current Y position
Трудная часть - это первый шаг. Остальное легко.
Если у вас есть шрифт с фиксированной шириной, разделить текст на строки не сложно. Вы просто вычисляете, сколько символов уместится на заданной ширине, индексируете строку для этой позиции и затем возвращаетесь к предыдущему разрыву слова. Захватите подстроку от начала предыдущей строки (или начала строки для первой строки) до этой позиции, и это ваша строка. Повторяйте, пока не дойдете до конца строки.
С шрифтом переменной ширины все немного сложнее, потому что вы не можете просто индексировать в строку n * character_width
символов. Вместо этого вы должны угадывать, тестировать, уточнять догадки и т. Д. В каждой графической подсистеме, с которой я работал, был какой-то метод MeasureString
, который сообщал бы мне, сколько пикселей потребуется для рендеринга строки с учетом конкретного шрифта. , Учитывая то, что я делал в прошлом:
Divide the surface width by the font's average character width
Index that far into the string, and find the next (or previous) word break.
Measure the string
If the result is wider than the width, go back one word and measure again.
If the result is narrower than the width, go forward one word and measure again.
Repeat the measure/adjust until you find the string that will fit.
Как только вы найдете подходящую подстроку, переместите свой начальный индекс вперед к началу следующей строки и делайте это снова, пока не достигнете конца строки.
Вертикальное центрирование группы линий:
starting_position.Y = (Surface_height - (num_lines * line_height)) / 2
Горизонтальное центрирование линии легко выполняется:
starting_position.X = (Surface_width - Measured_string_width) / 2
Вы должны вычислить starting_position.X
для каждой строки. Координата Y увеличивается на line_height
для каждой последующей строки.