Учебное пособие: Вывод текста
BOOLGetCharWidth( hDC, uFirstChar, uLastChar, lpnWidths );
BOOLGetCharABCWidth( hDC, uFirstChar, uLastChar, lpABC );
Функция GetCharWidth() определяет ширину каждого символа, входящего в интервал от uFirstChar до uLastChar и размещает результаты в массиве целых чисел, указанном параметром lpnWidths.
Функция GetCharABCWidth() возвращает более подробную информацию о ширине каждого символа, которая используется только TrueType шрифтами.
Результаты размещаются в массиве структур типа ABC, смысл полей поясним рисунком:
В-третьих , при выводе текста с помощью функции TextOut() (или ExtTextOut()), используется еще один атрибут GDI, который называется “режим выравнивания текста”. Он устанавливается и проверяется с помощью функций:
UINT SetTextAlign( hDC, nAlign );
UINT GetTextAlign( hDC );
Этот атрибут указывает, как надо располагать строку текста относительно указанной начальной точки. Обычно указанная точка задает положение верхнего левого угла строки. Однако с помощью функции SetTextAlign() вы можете установить и иной режим выравнивания.
Параметр nAlign указывает положение какой точки задается:
по горизонтали | по вертикали |
TA_LEFT (по умолчанию) | TA_TOP (по умолчанию) |
TA_CENTER | TA_BASELINE |
TA_RIGHT | TA_BOTTOM |
В некоторых случаях с помощью режима выравнивания можно обойтись без вычисления ширины строки самим, а переложить эту работу на Windows.
Для этого существует дополнительные режимы выравнивания TA_UPDATECP и TA_NOUPDATECP (по умолчанию). Если используется режим TA_UPDATECP, то координаты, указывающие положение точки вывода текста игнорируются, а вместо них используется атрибут контекста устройства “положение текущей точки”. После операции вывода эта текущая точка перемещается на правую границу выведенного текста.
Для начальной установки текущей точки в нужную позицию (или при переходе со строки на строку) Вы можете воспользоваться функцией:
DWORD MoveTo( hDC, nX, nY );
В-четвертых , на вывод текста влияют атрибуты контекста устройства, выравнивающие длины строк. Для этого GDI содержит две функции, изменяющие интервалы между словами и символами.
Первая функция
intSetTextCharacterExtra( hDC, nExtraSpace );
устанавливает интервал между двумя соседними символами. С ее помощью легко можно “разрядить” строку или слово так, что бы ее длина оказалась равна требуемой величине.
Вторая функция используется для задания ширины символов, используемых для разделения слов в строке. Каждый шрифт содержит символ, который называется “символ–разделитель” (Break Char). Какой символ является разделителем, можно определить по значению поля .tmBreakChar структуры TEXTMETRIC, так как для разных шрифтов могут быть установлены разные символы–разделители. Обычно это пробел.
int SetTextJustification( hDC, nExtraSpace, cBreakChars );
Эта функция изменяет ширину символа–разделителя таким образом, что бы cBreakChars, встреченных в строке, увеличили ее ширину на nExtraSpace единиц.
Дополнительные функции для вывода текста
Рассмотренная функция TextOut() является простейшей. У нее много ограничений. Например, она не распознает управляющих символов в строке типа табуляции, перевода строки и возврата каретки. В некоторых случаях возможно применение иных функций, осуществляющих вывод текста.
Если строка текста содержит символы табуляции, то Вы должны вместо функции TextOut() использовать функцию:
LONG TabbedTextOut(
hDC, nXStart, nYStart, lpsString, wLength, cTabStops, lpnTabPositions, nTabOrigin);
Первые 5 параметров этой функции используются так же, как и в функции TextOut(), а три дополнительных применяются таким образом:
Параметр lpnTabPositions содержит массив x–координат точек, в которых происходит остановка табулятора. Он должен быть упорядочен в возрастающем порядке. Параметр cTabStops задает число таких точек.