Всего с пакетом Турбо Паскаль поставляется четыре шрифта (хотя можно, используя отдельный специальный пакет, самостоятельно расширить их набор). Кроме того, доступен системный матричный шрифт 8x8 для графических режимов (всегда доступны символы с ASCII-кодами от 0 до 127 и символы с кодами от 128 до 255 при условии, что их матрицы загружены в память ПЭВМ). Для обозначения этих пяти шрифтов введены константы:
CONST
DefaultFont = 0; { матричный шрифт 8x8 (по умолчанию ) }
TriplexFont = 1; { полужирный шрифт }
SmallFont = 2; { светлый шрифт (тонкое начертание) }
SansSerifFont = 3; { книжная гарнитура (рубленый шрифт) }
GothicFont = 4; { готический шрифт }
DefaultFont — это уже упоминавшийся матричный шрифт 8x8. Если не принимать никаких действий по смене шрифта, то будет принят именно он.
Активизация любого из названных шрифтов осуществляется процедурой
SetTextStyle( Font, Direction : Word; CharSize : Word )
Здесь параметр Font — номер шрифта (например, одна из описанных выше констант), Direction — расположение текста (по умолчанию принимается горизонтальное). Возможны лишь две ориентации текста, обозначенные константами:
CONST
HorizDir = 0; { горизонтальная, слева направо }
VertDir = 1; { вертикальная, снизу вверх }
При значении Direction, равном VertDir, все символы будут повернуты против часовой стрелки на 90° и выводятся снизу вверх. Однако на самом деле есть еще один вариант регулирования направления шрифтов. Если задать Direction=2, то буквы будут повернуты так же, как и при Direction=VertDir, но вывод строки будет производиться горизонтально, слева направо.
Размер каждого символа устанавливается параметром CharSize, диапазон изменения которого составляет от 1 до 10. Стандартное значение CharSize для матричного шрифта 8x8 равно единице, а для штриховых шрифтов — четырем. Однако это можно не запоминать: достаточно передать в CharSize значение 0, и шрифт будет выводиться в стандартном размере. Чтобы продемонстрировать, как влияет этот параметр на размер изображения, можно задать CharSize=2 для
- 460 -
шрифта DefaultFont, и на экран будет выведен символ в матрице 16x16. Штриховые же шрифты задаются по-другому: в некоторой единичной системе координат описывается последовательное прохождение контура, образующего символ. Поскольку координаты каждой следующей точки контура заданы относительно предыдущей, то и модификация шрифта (увеличение, расширение и т.п.) производится простым умножением этих координат на соответствующее число.
При каждом вызове процедурой SetTexStyle какого-либо шрифта он читается с диска и загружается в память. Это обстоятельство вносит некоторые сложности. Во-первых, если программа использует штриховые шрифты, необходимо, чтобы файлы соответствующих шрифтов находились в известном каталоге совместно с BGI-файлами. В противном случае, не найдя их, система будет использовать DefaultFont, т.е. матричный шрифт 8x8. Во-вторых, при быстром переключении между несколькими штриховыми шрифтами будет происходить задержка программы на время, необходимое для считывания соответствующего шрифта с диска. Это случается потому, что в рабочей памяти может храниться только один штриховый шрифт. Чтобы определить результат чтения файла шрифта с диска и загрузки его в память, можно проверить значение функции GraphResult. Перечень значений, возвращаемых ею в этом случае, приведен в табл. 19.6.
Таблица 19.6
GraphResult | Смысл значения |
0 | Успешное выполнение операции |
-8 | Файл CHR не найден |
-9 | Не хватает памяти для загрузки выбранного шрифта |
-11 | Ошибка графики |
-12 | Ошибка ввода-вывода |
-13 | Неправильное содержимое файла шрифта |
-14 | Неправильный номер шрифта |
19.9.2. Предварительная загрузка и регистрация шрифтов
19.9.2.1. Загрузка шрифтов из пакета Турбо Паскаль. Для хранения в памяти более одного шрифта одновременно необходимо предварительно разместить их в памяти и вызвать функцию
- 461 -
RegisterBGIFont( FontPtr : Pointer ) : Integer
которая регистрирует шрифт в системе и возвращает его номер или отрицательный код ошибки. После этого шрифт становится доступным в любой момент работы программы. Последовательность действий при этом должна быть следующей:
1. В динамической памяти (куче) отводится область размером с файл шрифта.
2. Файл шрифта считывается с диска и помещается в эту область.
3. Указатель на шрифт в памяти регистрируется при помощи функции RegisterBGIDriver.
Пример процедуры загрузки шрифта в память приведен на рис. 19.32. В процедуру надо передать полное имя одного из CHR-файлов и сохранить возвращаемые ею указатель на место шрифта в памяти FPtr и размер Size (это может понадобиться при удалении шрифтов из кучи процедурой FreeMem(FPtr.Size)).
| PROCEDURE LoadFont(BGIFileName: String; VAR FPtr: Pointer;