
- •Вопрос 1. Вывод текста. Шрифты. Параметры шрифтов ………………………3
- •Вопрос 2. Обработка сообщений от мыши и клавиатуры. Понятие
- •Вопрос 1. Вывод текста. Шрифты. Параметры шрифтов.
- •Типы шрифтов
- •Отображение на экране
- •1.3.1. Создание новых шрифтов
- •1.3.2. Функции для работы со шрифтами
- •Вопрос 2. Обработка сообщений от мыши и клавиатуры. Понятие фокуса ввода.
- •2. Клавиатура
- •2.1. Клавиатурные сообщения
- •2.2. Параметры клавиатурных сообщений
- •2.3. Символьные клавиатурные сообщения
- •3. Мышь
- •3.1. Сообщения, поступающие от мыши
1.3.1. Создание новых шрифтов
Создание шрифтов занимает некоторое время (особенно для отображения TrueType шрифтов - Windows автоматически генерирует промежуточный растровый шрифт, который и используется при выводе). Если надо создавать шрифты, то это удобно делать при создании окна или даже при запуске приложения, а уничтожать - при закрытии окна или при завершении приложения (как и все объекты GDI, созданный шрифт уничтожается с помощью функции DeleteObject).
Если нужно получить хендл стандартного шрифта, то можно воспользоваться функцией:
HFONT GetStockObject( 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 имя шрифта. Пустое имя соответствует шрифту устройства.