Предварительная загрузка и регистрация шрифтов




19.9.2.1. Загрузка шрифтов из пакета Турбо Паскаль. Для хранения в памяти более одного шрифта одновременно необходимо предварительно разместить их в памяти и вызвать функцию {460}

RegisterBGIFont(FontPtr: Pointer): Integer

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

1. В динамической памяти (куче) отводится область размером с файл шрифта.

2. Файл шрифта считывается с диска и помещается в эту область.

3. Указатель на шрифт в памяти регистрируется при помощи функции RegisterBGIDriver.

Пример процедуры загрузки шрифта в память приведен на рис. 19.32. В процедуру надо передать полное имя одного из CHR-файлов и сохранить возвращаемые ею указатель на место шрифта в памяти FPtr и размер Size (это может понадобиться при удалении шрифтов из кучи процедурой FreeMem(FPtr.Size)).

PROCEDURE LoadFont(BGIFileName: String; VAR FPtr: Pointer; VAR Size: Word); VAR FontFile: File; BEGIN Assign(FontFile,BGIFileName); { связь файла с диском } Reset(FontFile, 1); { чтение с начала, побайтно } Size:=FileSize(FontFile); { размер файла со шрифтом } GetMem(FPtr, Size); { выделение участка памяти } BlockRead(FontFile,FPtr:,Size); { загрузка туда шрифта } Close(FontFile); { закрытие файла } if RegisterBGIFont(FPtr) < grOK then begin { Если возникла ошибка, то } WriteLn('Ошибка загрузки шрифта: ', { выдать } GraphErrorMsg(GraphResult)); {сообщение } ReadLn { пауза до нажатия ввода... } end {if} END;

Рис. 19.32

Регистрация может проводится до инициализации графики. Так, в примере на рис. 19.32 считается, что текущий режим — текстовый, и используется оператор WriteLn для выдачи аварийного сообщения. Функция RegisterBGIFont может возвращать значения ошибки (табл. 19.7). {461}

Код Обозначение ошибки Пояснения
-11 grError Может возникнуть, если таблица шрифтов уже заполнена. Всего можно зарегистрировать десять шрифтов. Так как в системе даны только четыре шрифта, то эта ошибка появляться не должна.
-13 grInvalidFont Заголовок файла шрифта — неправильный или испорченный.
-14 grInvalidFontNum Номер шрифта в заголовке файла шрифта — неправильный.

19.9.2.2. Регистрация новых штриховых шрифтов. Модуль Graph может поддерживать таблицу из десяти шрифтов. Однако в системе их представлено только четыре (не считая DefaultFont, который не требует загрузки), Возникает вопрос, как указать системе, что мы хотим использовать новые шрифты, не имеющие идентификаторов в системе (созданные самостоятельно или приобретенные дополнительно). Модуль Graph предоставляет и такую возможность — главное, чтобы файл шрифтов был в формате фирмы Borland. Пользуясь функцией

InstallUserFont(FontFileName: String): Integer;

можно установить соответствие между именем шрифтового файла (FontFileName) и его регистрационным номером в системе (возвращаемым функцией InstallUserFont). После этого можно выбрать этот шрифт процедурой SetTextStyle, указав первым параметром номер нового шрифта. Если таблица шрифтов уже вся заполнена, то функция возвращает значение 0 (DefaultFont). В общем случае, ошибка установки нового шрифта диагностируется функцией GraphResult. После установки можно обращаться с новым шрифтом как со стандартным, и в том числе загружать в память.

19.9.2.3. Загрузка матричных шрифтов 8x8. Часть матричного шрифта 8x8 (коды от 0 по 127) реализована в ПЭВМ аппаратно и всегда доступна. Другая часть (коды от 128 до 255) должна быть предварительно резидентно загружена в память ПЭВМ. Обычно это делается программами-русификаторами или утилитой MS-DOS GRAFTABL. Но можно это проделать самим, предварительно создав файл типа File of Byte из 128 матриц по восемь байтов, представля-{462}ющий новый матричный шрифт (размер файла должен равняться 1024 байт). Имея такой файл, легко установить его в качестве шрифта DefaultFont, как показано на рис. 19.33.

USES DOS, Graph; { необходим модуль DOS } VAR OldFont8x8: Pointer; { адрес исходного шрифта 8x8 } PROCEDURE LoadFont8x8(FileName: String; VAR FPtr:Pointer); VAR FontFile: File; BEGIN Assign(FontFile,FileName); { связывание файла с диском } Reset(FontFile, 1024); { чтение с начала и целиком } GetMem(FPtr, 1024); { выделение участка памяти } BlockRead(FontFile,FPtr^,1); { загрузка в него шрифта } Close(FontFile); { закрытие файла } GetIntVec($1F,OldFont8x8); { запоминание старого шрифта } SetIntVec($1F, FPtr) { установка нового шрифта } END;

Рис. 19.33

Важно предусмотреть, чтобы перед окончанием работы программа восстанавливала адрес исходного шрифта при помощи вызова процедуры модуля DOS SetIntVec($1F, OldFont8x8).

Описанные способы подключения к системе шрифтов имеют один общий недостаток: для того чтобы программа, использующая их, нормально работала, необходимо наличие соответствующих шрифтов в текущем или известном программе каталоге файлов. Начичие дополнительных файлов в системе снижает ее надежность, поэтому в языке Турбо Паскаль предусмотрена возможность встраивания шрифтов прямо в ЕХЕ-файл. Этот вопрос рассматривается в разделе 19.10.



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2022-11-01 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: