
- •Уп. 3. Вывод в окно
- •3.1. Сообщение wm_paint
- •3.2. Виды контекста отображения
- •Общий контекст отображения
- •Контекст отображения для класса окон
- •Личный контекст отображения
- •Родительский контекст отображения
- •Контекст отображения для окна
- •3.3. Установка атрибутов контекста отображения
- •3.4. Вывод текста
- •3.4.1. Настройка параметров шрифта
- •3.4.2. Выбор шрифта в контекст отображения
- •3.4.3. Функции вывода текста
- •3.4.4. Пример вывода текста в окно
- •3.4.5. Определение метрик шрифта
- •3.5. Рисование геометрических фигур
- •3.5.1. Функции рисования точки
- •3.5.2. Функции рисования линий
- •3.5.3. Функции рисования замкнутых фигур
- •Контрольные вопросы
- •Упражнения
- •Приложение 3
3.4. Вывод текста
3.4.1. Настройка параметров шрифта
В контекст отображения по умолчанию выбирают системный шрифт. Для создания логического шрифта удобно вызвать функцию 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;
Назначение полей этой структуры:
lfHeight – высота шрифта в логических единицах. Положительное значение поля lfHeight задает высоту ячейки вывода букв. Если lfHeight < 0, то абсолютная величина значения lfHeight задает высоту символов. При lfHeight = 0 создают шрифт с высотой символов по умолчанию: lfHeight = 12.
lfWidth – ширина символов в логических единицах. Если указано нулевое значение, используют ширину по умолчанию.
lfEscapement – угол (в направлении против часовой стрелки) в десятых долях градуса между линией вывода строки и координатной осью X. Значение lfEscapement может отличаться от нуля только для масштабируемых и векторных шрифтов.
lfOrientation – угол (в направлении против часовой стрелки) в десятых долях градуса между линией основания символа и координатной осью X. Рекомендуется задавать равным значению lfEscapement.
lfWeight – вес шрифта. Определяет жирность символов шрифта и может находиться в пределах от 0 до 1000. Принимает значения констант из следующей таблицы:
Константа |
Вес |
Константа |
Вес |
Константа |
Вес |
FW_DONTCARE |
0 |
FW_NORMAL |
400 |
FW_BOLD |
700 |
FW_THIN |
100 |
FW_REGULAR |
400 |
FW_EXTRABOLD |
800 |
FW_EXTRALIGHT |
200 |
FW_MEDIUM |
500 |
FW_ULTRABOLD |
800 |
FW_ULTRALIGHT |
200 |
FW_SEMIBOLD |
600 |
FW_BLACK |
900 |
FW_LIGHT |
300 |
FW_DEMIBOLD |
600 |
FW_HEAVY |
900 |
Многие шрифты содержат символы только весов FW_NORMAL, FW_REGULAR (нормальный) и FW_BOLD (полужирный). Если задать нулевое значение (lfWeight = 0), используют вес по умолчанию.
Если lfItalic не равен 0, запрашивают шрифт с наклонными буквами.
Если lfUnderline не равен 0, запрашивают шрифт с подчеркиванием букв.
Если lfStrikeOut не равен 0, запрашивают шрифт с перечеркнутыми буквами.
lfCharSet – наиболее важное поле структуры. Оно задает набор требуемых символов. Может принимать значения констант из следующей таблицы:
Константа |
Описание |
ANSI_CHARSET |
Набор символов в кодировке ANSI |
DEFAULT_CHARSET |
Задают для запроса логического шрифта |
SYMBOL_CHARSET |
Символьный шрифт (например, Wingdings) |
SHIFTJIS_CHARSET |
Нужен для работы с японской версией Windows |
OEM_CHARSET |
Набор символов в кодировке OEM |
Если lfCharSet = 0, будет выбран шрифт ANSI_CHARSET.
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 Туре |
lfClipPrecision задает способ обрезания изображения символа на границе вывода. Можно использовать следующие константы: CLIP_STROKE_PRECIS, CLIP_MASK, CLIP_DEFAULT_PRECIS, CLIP_LH_ANGLES, CLIP_TT_ALWAYS, CLIP_EMBEDDED и CLIP_CHARACTER_PRECIS. Если указана CLIP_LH_ANGLES, направление вращения текста зависит от установленного режима отображения.
lfQuality задает качество отображения символов. Можно указывать одну из следующих констант:
Константа
Описание
DEFAULT_QUALITY
Качество не имеет значения
DRAFT_QUALITY
Низкое качество
PROOF_QUALITY
Высокое качество
lfPitchAndFamily задает ширину символов и определяет семейство шрифта. Фиксированная или переменная ширина символов задается при помощи следующих констант:
Константа |
Описание |
DEFAULT_PITCH |
Не имеет значения, будет ли шрифт иметь фиксированную или переменную ширину символов |
FIXED_PITCH |
Нужен шрифт фиксированной ширины символов |
VARIABLE_PITCH |
Нужен шрифт с переменной шириной символов |
Следующие константы задают семейство шрифта:
Константа |
Описание |
FF_DECORATIVE |
Шрифт, содержащий маленькие рисунки (например, Wingdings) |
FF_DONTCARE |
Семейство шрифта не имеет значения |
FF_MODERN |
Семейство Modem. Фиксированная ширина символов, могут быть засечки (но могут и не бьггь) |
FF_ROMAN |
Семейство Roman. Переменная ширина букв, есть засечки |
FF_SCRIPT |
Семейство Script. Рукописный шрифт |
FF_SWISS |
Семейство Swiss. Переменная ширина букв, нет засечек |
lfFaceName – строка с именем шрифта. Длина этой строки не должна превышать 32 символа. Если lfFaceName – пустая строка, используют шрифт, который соответствует по другим атрибутам.
Получив запрос, GDI начинает искать шрифт, сравнивая последовательно поля lfCharSet, lfPitchAndFamily и lfFaceName. После сравнения этих полей GDI сравнивает высоту букв шрифта, затем поля lfWidth, lfItalic, lfUnderline и lfStrikeOut.