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

3.2.8 Метрические параметры текста. Подробности

Структура TEXTMETRIC обеспечивает полную информацию о выбранном в данный момент в контексте устройства шрифте. Вертикальный размер шрифта определяется только пятью величинами, как показано на рис. 3.3.

Эти величины вполне объяснимы. Значение tmInternalLeading — это величина пустого пространства, отведенного для указания специальных знаков над символом. Если это значение равно 0, то помеченные прописные буквы делаются немного меньше, чтобы специальный символ поместился внутри верхней части символа. Значение tmExternalLeading — это величина пустого пространства, которое разработчик шрифта установил для использования между строками символов. Вы можете согласиться или отклонить предложение разработчика при распределении пространства между строками текста.

В структуре TEXTMETRIC имеется два поля, описывающих ширину символа: tmAveCharWidth (усредненная ширина символов строки) и tmMaxCharWidth (ширина самого широкого символа шрифта). Для фиксированного шрифта эти две величины одинаковы.

В примерах программ этой главы используется другое значение ширины символа — средняя ширина прописных букв. Она может быть точно рассчитана как 150% от tmAveCharWidth.

Важно понимать, что размеры системного шрифта зависят от разрешающей способности дисплея, на котором работает Windows. Система Windows обеспечивает независимый от оборудования графический интерфейс, но, тем не менее, вам необходимо помочь ей. Не пишите программы для Windows, опирающиеся на конкретные размеры символов. Не задавайте никаких фиксированных значений. Используйте функцию GetTextMetrics для получения этой информации.

3.2.9 Форматирование текста

Поскольку размеры системного шрифта не меняются в рамках одного сеанса работы с системой Windows, вам необходимо вызвать функцию GetTextMetrics только один раз при выполнении программы. Хорошо сделать этот вызов при обработке сообщения WM_CREATE в оконной процедуре. Сообщение WM_CREATE — это первое сообщение, которое принимает оконная процедура. Windows вызывает вашу оконную процедуру с сообщением WM_CREATE, когда вы вызываете в WinMain функцию CreateWindow.

Предположим, что вы пишите программу для Windows, которая выводит на экран несколько строк текста, появляющихся друг за другом в направлении к нижней границе рабочей области. Вы хотите получить значения высоты и ширины символов. Внутри оконной процедуры вы можете определить две переменные для хранения средней ширины символов (cxChar) и полной высоты символов (cyChar):

static int cxChar, cyChar;

Префикс с, добавленный к именам переменных, означает "счетчик" (сount) и в сочетании с x или y относится к длине или ширине. Эти переменные определяются как статические, поскольку они должны оставаться без изменений при обработке оконной процедурой других сообщений (таких как WM_PAINT). Если эти переменные определяются как глобальные вне какой бы то ни было функции, то нет необходимости определять их как статические.

Здесь представлен код обработки сообщения WM_CREATE:

case WM_CREATE:

hdc = GetDC(hwnd);

GetTextMetrics(hdc, &tm);

cxChar = tm.tmAveCharWidth;

cyChar = tm.tmHeight + tm.tmExternalLeading;

ReleaseDC(hwnd, hdc);

return 0;

Если вы не хотите учитывать межстрочное пространство (external leading), то можно использовать:

cyChar = tm.tmHeight;

От вас зависит, как использовать полученный размер символов для расчета координат при выводе информации.

Самое простое — оставить пустое поле cyChar в верхней части рабочей области, и cxChar в ее левой части. Для вывода на экран нескольких строк текста с выравниванием по левому краю при вызове функции TextOut используйте следующее значение координаты x:

cxChar

Значение координаты y в TextOut:

cyChar *(1 + i)

где i — это номер строки, начиная с 0.

Вы часто будете сталкиваться с необходимостью выводить отформатированные числа как простые символьные строки. Если вы программировали для MS-DOS с использованием стандартных библиотечных функций языка С, вы, вероятно, для форматирования применяли функцию printf. В Windows функция printf не работает, поскольку printf предназначена для стандартного устройства вывода, а эта установка в Windows не имеет смысла.

В Windows есть аналогичная функция sprintf. Она работает точно также, как и функция printf, отличие заключается в том, что форматируемая строка помещается в символьный массив. Для вывода строки на экран можно затем использовать функцию TextOut. Очень удобно то, что возвращаемым значением sprintf является длина строки — вы можете передать это значение в TextOut в качестве параметра iLength. Следующий фрагмент программы показывает типовое использование функций sprintf и TextOut:

int iLength;

char szBuffer[40];

[другие инструкции программы]

iLength = sprintf(szBuffer, "Сумма %d и %d равна %d", nA, nB, nA + nB);

TextOut(hdc, x, y, szBuffer, iLength);

Для достаточно простых задач вы могли бы избежать вычисления iLength и объединить два оператора в один:

TextOut(hdc, x, y, szBuffer, sprintf(szBuffer, "Сумма %d и %d равна %d", nA, nB, nA + nB));

Это не очень красиво, но вполне работоспособно.

Если вам не нужно выводить числа с плавающей точкой, то вместо sprintf вам лучше использовать функцию wsprintf. Синтаксис функции wsprintf такой же, как и sprintf, но она включена в Windows, поэтому ее использование не увеличит размер вашего EXE-файла.

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