Смекни!
smekni.com

Семейства шрифтов в Windows (стр. 1 из 5)

1. Семейства шрифтов в Windows

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

Семейство Ширина штриха Ширина символов Наличие засечек примеры
MODERN постоянная постоянная Courier New
ROMAN переменная переменная есть Times New Roman, Antiqua, Garamond, Palatino, Bodoni
SWISS переменная переменная нет Arial, Helvetica, Futura, Avantgarde, Optima, Swiss
SCRIPT Script, Odessa Script FWF, Decor, Jikharev, Parsek
DECORATIVE Windings, MusicalSymbols, Symbol
DONTCARE

Обычно к семейству MODERN относят все шрифты фиксированной ширины. Название MODERN указывает на сравнительно недавнюю историю этих шрифтов - они получили распространение с развитием печатающей техники и компьютеров, тогда как другие виды шрифтов возникали с XV века, когда заканчивалась эпоха готического шрифта.

В те времена начинал формироваться шрифт, похожий по своему начертанию на один из древнейших шрифтов - римский капитальный. Это был пропорциональный шрифт с засечками и нормальной контрастностью, позже он получил очень широкое распространение в типографском деле и дожил до наших дней. За свою долгую историю он многократно видоизменялся и стал родоначальником большого числа поколений шрифтов. В Windows такие шрифты относятся к семейству ROMAN.

Реально этому семейству соответствует очень большое число разных шрифтов, выделяемых в других классификационных системах. В частности, можно выделить так называемые брусковые шрифты, обычно со слабо выраженным контрастом и засечками, перпендикулярными штрихам и имеющими примерно такую же ширину (пример - Courier); В XX веке возникли шрифты, получившие очень широкое распространение. Наиболее распространенное название для этих шрифтов - рубленые. Эти шрифты не имеют контраста и засечек (sans serif), в Windows им соответствует семейство SWISS. Семейство DONTCARE реально не соответствует никакой группе шрифтов. Оно используется только при указании, из какого семейства надо выбирать шрифт - при этом оно обозначает “любое семейство”.

1.1 Стандартные шрифты Windows

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

Имя шрифта семейство кодовая таблица файл(ы)
растровые шрифты
System SWISS ANSI xxxSYS.FON
FixedSys DONTCARE ANSI xxxFIX.FON
Terminal MODERN OEM xxxOEM.FON
Courier MODERN ANSI COURy.FON
MS Sans Serif SWISS ANSI SSERIFy.FON
MS Serif ROMAN ANSI SERIFy.FON
Small Fonts ROMAN ANSI SMALLy.FON
Symbol DECORATIVE SYMBOL SYMBOLy.FON
векторные шрифты
Modern MODERN OEM MODERN.FON
Roman ROMAN OEM ROMAN.FON
Script SCRIPT OEM SCRIPT.FON
TrueType
Arial SWISS ANSI ARIALzz.TTF(.FOT)
Courier New MODERN ANSI COURzz.TTF(.FOT)
Times New Roman ROMAN ANSI TMSRMN.TTF(.FOT)
Windings DONTCARE ANSI WINDINGS.TTF(.FOT)

В этой таблице следует внимательно рассмотреть имена файлов. В этих именах маленькими буквами (xxx,y,zz) обозначены изменяющиеся части.

Так xxx обозначает устройство, для которого был спроектирован шрифт. Вместо этой последовательности реально написано CGA, EGA, VGA или 8514.

Символ y обозначает категорию устройств, к которой относится данный шрифт. Возможные значения можно найти в таблице:

Буква Соотношение сторон Разрешающая способность X/Y (пиксел/дюйм) Устройство
A 200 96/48 CGA
B 133 96/72 EGA
C 83 60/72 Okidata printers
D 167 120/72 IBM, Epson printers
E 100 96/96 VGA
F 100 120/120 IBM 8514

Последовательность zz указывает, какого типа шрифт описан в этом файле: нормальный (пустая последовательность), жирный BD, наклонный I или жирный наклонный BI.

1.2Получение хендла шрифта

Для того, что бы Вы могли применять шрифт в Вашей программе, Вы должны сначала получить хендл соответствующего шрифта. Шрифт является объектом GDI, поэтому работа с ним похожа на работу с другими объектами GDI. Как правило вы должны выполнить следующие действия:

получить хендл либо стандартного шрифта, либо создав "новый" шрифт

При создании "нового" шрифта создается соответствующий объект GDI, а не новый файл описания шрифта.

выбрать шрифт в контекст устройства

осуществить вывод, используя текущий шрифт

если шрифт был создан, то его надо уничтожить.

Создание шрифтов занимает некоторое время (особенно для отображения TrueType шрифтов - Windows автоматически генерирует промежуточный растровый шрифт, который и используется при выводе). Если надо создавать шрифты, то это удобно делать при создании окна или даже при запуске приложения, а уничтожать - при закрытии окна или при завершении приложения (как и все объекты GDI, созданный шрифт уничтожается с помощью функции DeleteObject).

Если Вам надо получить хендл стандартного шрифта, то Вы можете воспользоваться функцией:

HFONTGetStockObject( nIndex );

Параметр nIndexможет быть:

ANSI_FIXED_FONT соответствует шрифту Courier
ANSI_VAR_FONT соответствует шрифту MS Sans Serif
OEM_FIXED_FONT соответствует шрифту Terminal
SYSTEM_FONT соответствует шрифту System; этот шрифт используется по умолчанию
SYSTEM_FIXED_FONT соответствует шрифту FixedSys; До версии Windows 3.0 системный шрифт был фиксированной ширины, он включен в Windows 3.1 для совместимости.
DEVICE_DEFAULT_FONT соответствует шрифту, загруженному в устройство; для дисплея не определен

Если Вам надо создавать собственный шрифт, то Вы можете воспользоваться одной из двух функций:

HFONT CreateFont(

nHeight, nWidth, nEscapement, nOrientation, nWeight,

bItalic, bUnderline, bStrikeOut,

bCharSet, bOutputPrecision, bClipPrecision, bQuality, bPitchAndFamily,

lpszFacename);

или

HFONT CreateFontIndirect( lpLogFont );

Чащеприменяетсяфункция CreateFontIndirect(), получающаявкачествепараметрауказательнаструктуру LOGFONT. Поляэтойструктурысовпадаютсаргументамифункции CreateFont().

typedef struct tagLOGFONT {

int lfHeight;

int lfWidth;

int lfEscapement;

int lfOrientation;

int lfWeight;

BYTE lfItalic;

BYTE lfUnderline;

BYTE lfStrikeOut;

BYTE lfCharSet;

BYTE lfOutPrecision;

BYTE lfClipPrecision;

BYTE lfQuality;

BYTE lfPitchAndFamily;

BYTE lfFaceName[LF_FACESIZE];

} LOGFONT;

Рассмотрим назначение полей этой структуры:

lfHeight задает требуемый размер шрифта в точках (пунктах). Если значение положительно, то в высоту включается межстрочный промежуток, а если отрицательно, то модуль указывает высоту символа шрифта. Значение 0 указывает, что используется значение высоты по умолчанию.

lfWidth задает среднюю ширину символов в пунктах. Значение 0 соответствует ширине по умолчанию.

lfEscapement задает наклон базовой линии строки в десятых долях градуса. Для растровых шрифтов игнорируется.

lfOrientation задает ориентацию символа относительно базовой линии в десятых долях градуса. Игнорируется для растровых и TrueType шрифтов, для векторных используются значения: 0, 900, 1800 и 2700

lfWeight задает вес символа (жирность). Соответствует количеству закрашенных пиксел из 1000. Предусмотрены условные обозначения для определения веса, начинающиеся на FW_... Например, нормальный текст (400) соответствует FW_NORMAL (FW_REGULAR), жирный (700) FW_BOLD.

lfItalic ненулевое значение задает наклон символов (начертание slanted). Значение 0 соответствует обычному тексту.

lfUnderline ненулевое значение задает подчеркивание строки текста линией. Значение 0 соответствует обычному тексту.

lfStrikeOut ненулевое значение задает перечеркивание строки текста линией. Значение 0 соответствует обычному тексту.

lfCharSet задает кодовую таблицу, которую должен поддерживать данный шрифт. Используются следующие условные обозначения:

ANSI_CHARSET кодовая таблица ANSI

OEM_CHARSET кодовая таблица OEM

SYMBOL_CHARSET символы

SHIFTJIS_CHARSET японская азбука

DEFAULT_CHARSET любая кодовая таблица.

lfOutPrecision указывает, насколько точно должен соответствовать подбираемый шрифт указанному размеру. (Реально Вы можете заказать растровый шрифт несуществующего размера). См. условные обозначения вида OUT_???_PRECIS в windows.h.

lpClipPrecision указывает, как должен отображаться частично невидимый символ. См. условные обозначения вида CLIP_???_PRECIS в windows.h.

lfQuality указывает качество получаемого шрифта. Обычно используется значение PROOF_QUALITY (или DEFAULT_QUALITY). Если размер растрового шрифта меньше, чем требуется, то Windows может масштабировать шрифт. Однако при этом резко ухудшается качество, поэтому масштабирование можно запретить, используя значение PROOF_QUALITY.

lfPitchAndFamily два младших бита задают тип шрифта - DEFAULT_PITCH (любой тип), VARIABLE_PITCH (пропорциональный) или FIXED_PITCH (моноширинный); старший байт указывает семейство, которое задается одним из следующих символов: FF_DECORATIVE, FF_DONTCARE, FF_MODERN, FF_ROMAN, FF_SCRIPT, FF_SWISS.

lfFaceName массив из LF_FACESIZE символов, содержащий заканчивающееся \0 имя шрифта. Пустое имя соответствует шрифту устройства.

1.3 Основы подбора шрифтов в Windows

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