Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
WinAPI.docx
Скачиваний:
49
Добавлен:
16.12.2018
Размер:
3.43 Mб
Скачать

4.13.8 Форматирование простого текста

Наступило время потренироваться в форматировании текста. Процесс форматирования заключается в расположении каждой строки текста в пределах установленных полей одним из четырех способов: с выравниванием влево, с выравниванием вправо, с выравниванием по центру или с выравниванием по всей ширине (когда строка растягивается от левого края до правого края с формированием одинаковых интервалов между словами). Первые три задачи можно решить, используя функцию DrawText с параметром DT_WORDBREAK, но ее использование ограничено. Например, вы не можете определить, какую часть текста функция DrawText сможет разместить в прямоугольнике вывода. Функция DrawText удобна для некоторых простых задач, но для более сложных задач форматирования вы, вероятно, захотите применить функцию TextOut.

Одной из наиболее часто используемых функций работы с текстом является функция GetTextExtentPoint32. (Это функция, имя которой претерпело некоторые изменения со времени более ранних версий Windows.) Эта функция дает значения ширины и высоты строки символов, основываясь на текущем шрифте, выбранном в контексте устройства:

GetTextExtentPoint32(hdc, pString, iCount, &size);

Ширина и высота текста в логических единицах возвращается в поля cx и cy структуры SIZE. Начнем с примера, использующего одну строку текста. Предположим, что вы выбрали шрифт в контексте устройства и теперь хотите вывести текст:

char *szText [ ] = "Hello, how are you?";

Вам нужно, чтобы текст начинался в позиции с вертикальной координатой yStart и находился между границами, установленными координатами xLeft и xRight. Ваша задача заключается в том, чтобы вычислить значение xStart горизонтальной координаты начала текста. Эта задача была бы значительно проще, если бы текст отображался с использованием шрифта фиксированной ширины, но это не является общим случаем. Сначала определим длину строки текста:

GetTextExtentPoint32(hdc, szText, strlen(szText), &size);

Если значение size.cx больше, чем (xRight xLeft), то строка слишком длинна, чтобы поместиться в указанных границах. Предположим, что строка все же помещается. Для того, чтобы выровнять текст влево, нужно просто установить значение xStart равным xLeft и затем вывести текст:

TextOut(hdc, xStart, yStart, szText, strlen(szText));

Это просто. Теперь вы можете прибавить значение size.cy к yStart и затем выводить следующую строку текста.

Чтобы выровнять текст вправо, воспользуемся для вычисления xStart следующей формулой:

xStart = xRight — size.cx;

Чтобы выровнять текст по центру между левой и правой границами используем другую формулу:

xStart =(xLeft + xRight — size.cx) / 2;

Теперь перед нами самая трудная задача — выровнять текст по всей ширине между левой и правой границами.

Расстояние между ними вычисляется как (xRight xLeft). Без растягивания по ширине текст имеет ширину size.cx. Разница между этими двумя величинами:

xRight — xLeft — size.cx

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

SetTextJustification(hdc, xRight — xLeft — size.cx, 3)

Второй параметр — это величина пробела, который должен быть распределен поровну между тремя символами пробела в символьной строке. Третий параметр — число символов пробела в строке, в нашем примере — 3.

Теперь установим значение xStart равным xLeft и выведем текст с помощью функции TextOut:

TextOut(hdc, xStart, yStart, szText, strlen(szText));

Текст будет выровнен по всей ширине между границами xLeft и xRight.

При каждом вызове функции SetTextJustification накапливается погрешность, если величина добавляемого пропуска не делится нацело на число символов пробела. Эта ошибка будет влиять на последующие вызовы функции GetTextExtent. Каждый раз перед тем, как начинать вывод новой строки, вы должны сбросить эту погрешность с помощью вызова функции:

SetTextJustification(hdc, 0, 0);

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]