В контекст отображения по умолчанию выбирают системный шрифт. Для создания логического шрифта удобно вызвать функцию CreateFontIndirect:
HFONT WINAPI CreateFontIndirect(const LOGFONT FAR* tptf);
Она возвращает дескриптор созданного шрифта. В качестве аргумента вызова функции CreateFontIndirect передают указатель на структуру типа LOGFONT:
typedef struct {
LONG lfHeight;
LONG lfWidth;
LONG lfEscapement;
LONG lfOrientation;
LONG lfWeight;
BYTE lfItalic;
BYTE lfUnderline;
BYTE lfStrikeOut;
BYTE lfCharSet;
BYTE lfOutPrecision;
BYTE lfClipPrecision;
BYTE lfQuality;
BYTE lfPitchAndFamily;
TCHAR lfFaceName[LF_FACESIZE];
} LOGFONT;
Назначение полей этой структуры:
1. lfHeight – высота шрифта в логических единицах. Положительное значение поля lfHeight задает высоту ячейки вывода букв. Если lfHeight < 0, то абсолютная величина значения lfHeight задает высоту символов. При lfHeight = 0 создают шрифт с высотой символов по умолчанию: lfHeight = 12.
2. lfWidth – ширина символов в логических единицах. Если указано нулевое значение, используют ширину по умолчанию.
3. lfEscapement – угол (в направлении против часовой стрелки) в десятых долях градуса между линией вывода строки и координатной осью X. Значение lfEscapement может отличаться от нуля только для масштабируемых и векторных шрифтов.
|
|
4. lfOrientation – угол (в направлении против часовой стрелки) в десятых долях градуса между линией основания символа и координатной осью X. Рекомендуется задавать равным значению lfEscapement.
5. lfWeight – вес шрифта. Определяет жирность символов шрифта и может находиться в пределах от 0 до 1000. Принимает значения констант из следующей таблицы:
Константа | Вес | Константа | Вес | Константа | Вес |
FW_DONTCARE | FW_NORMAL | FW_BOLD | |||
FW_THIN | FW_REGULAR | FW_EXTRABOLD | |||
FW_EXTRALIGHT | FW_MEDIUM | FW_ULTRABOLD | |||
FW_ULTRALIGHT | FW_SEMIBOLD | FW_BLACK | |||
FW_LIGHT | FW_DEMIBOLD | FW_HEAVY |
Многие шрифты содержат символы только весов FW_NORMAL, FW_REGULAR (нормальный) и FW_BOLD (полужирный). Если задать нулевое значение (lfWeight = 0), используют вес по умолчанию.
6. Если lfItalic не равен 0, запрашивают шрифт с наклонными буквами.
7. Если lfUnderline не равен 0, запрашивают шрифт с подчеркиванием букв.
8. Если lfStrikeOut не равен 0, запрашивают шрифт с перечеркнутыми буквами.
9. lfCharSet – наиболее важное поле структуры. Оно задает набор требуемых символов. Может принимать значения констант из следующей таблицы:
Константа | Описание |
ANSI_CHARSET | Набор символов в кодировке ANSI |
DEFAULT_CHARSET | Задают для запроса логического шрифта |
SYMBOL_CHARSET | Символьный шрифт (например, Wingdings) |
SHIFTJIS_CHARSET | Нужен для работы с японской версией Windows |
OEM_CHARSET | Набор символов в кодировке OEM |
Если lfCharSet = 0, будет выбран шрифт ANSI_CHARSET.
10. lfOutPrecision задает необходимую степень соответствия между параметрами запрашиваемого и предоставляемого шрифта. Можно указывать одну из следующих констант:
|
|
Константы | Описание |
OUT_DEFAULT_PRECIS | Степень соответствия по умолчанию |
OUT_STRING_PRECIS или OUT_CHARACTER_PRECIS | Выбрать шрифт с наибольшим соответствием в размерах символов |
OUT_STROKE_PRECIS | Искать шрифт с полным соответствием |
OUT_TT_PRECIS | Предпочтение шрифтам True Туре |
OUT_DEVICE_PRECIS | Выбрать шрифт устройства вывода |
OUT_RASTER_PRECIS | Выбрать растровый шрифт |
OUT_TT_ONLY_PRECIS | Выбирать только шрифты True Туре |
11. lfClipPrecision задает способ обрезания изображения символа на границе вывода. Можно использовать следующие константы: CLIP_STROKE_PRECIS, CLIP_MASK, CLIP_DEFAULT_PRECIS, CLIP_LH_ANGLES, CLIP_TT_ALWAYS, CLIP_EMBEDDED и CLIP_CHARACTER_PRECIS. Если указана CLIP_LH_ANGLES, направление вращения текста зависит от установленного режима отображения.
12. lfQuality задает качество отображения символов. Можно указывать одну из следующих констант:
Константа | Описание |
DEFAULT_QUALITY | Качество не имеет значения |
DRAFT_QUALITY | Низкое качество |
PROOF_QUALITY | Высокое качество |
13. lfPitchAndFamily задает ширину символов и определяет семейство шрифта. Фиксированная или переменная ширина символов задается при помощи следующих констант:
Константа | Описание |
DEFAULT_PITCH | Не имеет значения, будет ли шрифт иметь фиксированную или переменную ширину символов |
FIXED_PITCH | Нужен шрифт фиксированной ширины символов |
VARIABLE_PITCH | Нужен шрифт с переменной шириной символов |
Следующие константы задают семейство шрифта:
Константа | Описание |
FF_DECORATIVE | Шрифт, содержащий маленькие рисунки (например, Wingdings) |
FF_DONTCARE | Семейство шрифта не имеет значения |
FF_MODERN | Семейство Modem. Фиксированная ширина символов, могут быть засечки (но могут и не бьггь) |
FF_ROMAN | Семейство Roman. Переменная ширина букв, есть засечки |
FF_SCRIPT | Семейство Script. Рукописный шрифт |
FF_SWISS | Семейство Swiss. Переменная ширина букв, нет засечек |
14. lfFaceName – строка с именем шрифта. Длина этой строки не должна превышать 32 символа. Если lfFaceName – пустая строка, используют шрифт, который соответствует по другим атрибутам.
Получив запрос, GDI начинает искать шрифт, сравнивая последовательно поля lfCharSet, lfPitchAndFamily и lfFaceName. После сравнения этих полей GDI сравнивает высоту букв шрифта, затем поля lfWidth, lfItalic, lfUnderline и lfStrikeOut.