Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конспект лекций Часть II.doc
Скачиваний:
14
Добавлен:
20.11.2018
Размер:
1.48 Mб
Скачать

П 3.3. Установка атрибутов контекста отображения для текста

Контекст отображения, кроме характеристик устройства вывода, со­держит указатели на выбранные в контекст инструменты. Ин­струменты настраивают с помощью атрибутов контекста отображения (их около 20).

По умолчанию для фона операции вывода в контекст отображения выбран белый цвет. Функция SetBkColor устанавливает новый цвет для фона вывода:

COLORREF SetBkCotor( HDC hdc, COLORREF crColor);

В случае успешной установки она возвращает значение предыдущего цвета фона. Параметр crColor задает новый цвет фона. Если установлен непрозрачный режим фона вывода, цвет фона crColor используют для заполнения промежутков между линиями изображения или символами текста. Этот цвет используют и при преобразовании разноцветных изо­бражений в моноцветные.

Тип COLORREF равноценен типу DWORD. Для получения значения цвета типа COLORREF существует функция

COLORREF RGB(BYTE bRed, BYTE bGreen, BYTE bBlue);

Она возвращает значение цвета в формате COLORREF в виде ин­тенсивности красной (bRed), зеленой (ЬGгееn) и голубой (bBlue) состав­ляющих цвета. Интенсивность каждого аргумента может принимать зна­чения в диапазоне от 0 до 255. Если все три значения раины нулю, ре­зультат - черный. Если все три - 255, результат - белый. В качестве примера в табл. перечислены красная, зеленая и голубая составляю­щие системных цветов.

В случае неудачи возвращаемое значение функции RGB равно CLR_INVALID.

Существует два режима фона- непрозрачный (OPAQUE - значение по умолчанию) и прозрачный (TRANSPARENT). В режиме непрозрачно­го вывода цвет фона текущей позиции заменяется цветом фона вывода. В режиме TRANSPARENT цвет фона не заменяется.

Режим фона уста­навливает функция SetBkMode:

int SetBkMode( HOC hoc, int IBkMode);

Параметр iBkMode принимает значение TRANSPARENT или OPAQUE. В случае успешного выполнения функция возвращает значе­ние предыдущего режима, иначе - нуль.

По умолчанию цвет вывода текста выбран черным. Другой цвет вы­вода символов текста устанавливает функция SetTextColor:

COLORREF SetTextColor(HDC hdc, COLORREF crColor);

Параметр crColor задает новый цвет. В случае успешной установки нового цвета возвращается значение предыдущего цвета, иначе -CLRJNVALID. Этот цвет также используют при преобразовании разно­цветных изображений в моноцветные и наоборот.

По умолчанию расстояние между буквами равно 0. Расстояние ме­жду буквами устанавливает функция SetTextCharacterExtra:

int SetTextCharacterExtra( HBC hdc, int nCharExtra);

Параметр nCharExtra определяет расстояние между символами в ло­гических единицах. Во всех режимах (кроме MMJTEXT) значение nCharExtra кратно пикселю. В случае успешного выполнения функция возвращает предыдущий интервал между символами, иначе - 231.

П 3.4. Вывод текста

3.4.1. Настройка параметров шрифта

В контекст отображения по умолчанию выбирают системный шрифт. Для создания логического шрифта удобно вызвать функцию CreateFont Indirect:

HFONT WINAPI CreateFontlndirect(const LOGFONT FAR* Iplf);

Она'возвращает дескриптор созданного шрифта. В качестве аргумента вызова функции CreateFonthidirect передают указатель на структуру типа LOGFONT:

typedef struct { LONG IfHeight;

LONG IfWidth;

LONG IfEscapement;

LONG IfOrientation;

LONG IfWeight;

BYTE Ifltalic;

BYTE IfUndertine;

BYTE IfStrikeOut;

BYTE IfCharSet;

BYTE IfOutPrecision;

BYTE IfClipPrecision;

BYTE IfQuality;

BYTE IfPitchAndFamily;

TCHAR IfFaceNamelLF.FACESIZE];

} LOGFONT;

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

1. IfHeight - высота шрифта в логических единицах. Положительное значение поля IfHeight задает высоту ячейки вывода букв. Если IfHeightO, то абсолютная величина значения IfHeight задает высоту символов. При lfHeight=0 создают шрифт с высотой символов по умолчанию: lffleight=12.

2. IfWidth - ширина символов в логических единицах. Если указано ну­левое значение, используют ширину по умолчанию.

3. IfEscapement - угол (в направлении против часовой стрелки) в деся­тых долях градуса между линией вывода строки и координатной осью X. Значение IfEscapement может отличаться от нуля только для масштабируемых и векторных шрифтов.

4. IfOrientation - угол (в направлении против часовой стрелки) в деся­тых долях градуса между линией основания символа и координатной осью X. Рекомендуется задавать равным значению IfEscapement.

5. IfWeight - вес шрифта. Определяет жирность символов шрифта и может находиться в пределах от 0 до 1000. Принимает значения кон­стант из следующей таблицы:

Константа

Вес

Константа

Вес

Константа

Вес

FW DONTCARE

0

FW NORMAL

400

FW BOLD

700

FW ТНШ

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), используют вес по умолчанию.

6. Если Ifltalic не равен 0, запрашивают шрифт с наклонными буквами.

7. Если IfUnderline не равен 0, запрашивают шрифт с подчеркиванием букв.

8. Если IfStrikeOut не равен 0, запрашивают шрифт с перечеркнутыми буквами.

9. IfCharSet - наиболее важное поле структуры. Оно задает набор тре­буемых символов. Может принимать значения констант из следую­щей таблицы:

Константа

Описание

ANSI_CHARSET

Набор символов в кодировке ANSI

DEFAULT_CHARSET

Задают для запроса логического шрифта

SYMBOL_CHARSET

Символьный шрифт (например, Wingdings)

SHIFTJIS_CHARSET

Нужен для работы с японской версией Windows

OEM_CHARSET

Набор символов в кодировке OEM

Если lfCharSet=0, будет выбран шрифт ANSI CHARSET. 10. IfOutPrecision задает необходимую степень соответствия между па­раметрами запрашиваемого и предоставляемого шрифта. Можно ука­зывать одну из следующих констант:

Константы

Описание

OUT DEFAULT PRECIS

Степень соответствия по умолчанию

OUT STRING PRECIS или OUT CHARACTER PRECIS

Выбрать шрифт с наибольшим соот­ветствием в размерах символов

OUT STROKE PRECIS

Искать шрифт с полным соответствием

OUT_TT_PRECIS

Предпочтение шрифтам True Type

OUT DEVICE PRECIS

Выбрать шрифт устройства вывода

OUT RASTER PRECIS

Выбрать растровый шрифт

OUT TT ONLY PRECIS

Выбирать только шрифты True Type

11. IfClipPrecision задает способ обрезания изображения символа на границе вывода. Можно использовать следующие константы: CLIP_STROKE_ PRECIS, CLIP_MASK, CLIP_DEFAULT_PRECIS, CLIP_LH_ANGLES, CLIP_TT_ALWAYS, CLIP_EMBEDDED и CLIP_CHARACTER_ PRECIS. Если указана CLIP_LH_ANGLES, направление вращения текста зависит от установленного режима отображения.

12,IfQuality задает качество отображения символов. Можно указывать одну из следующих констант:

Константа

Описание

DEFAULT_QUALITY

Качество не имеет значения

DRAFT_QUALITY

Низкое качество

PROOF_QUALITY

Высокое качество

13. IfPitchAndFamily задает ширину символов и определяет семейство шрифта. Фиксированная или переменная ширина символов задается при помощи следующих констант:

Константа

Описание

DEFAULT_PITCH

He имеет значения, будет ли шрифт иметь фикси­рованную или переменную ширину символов

FIXED_PITCH

Нужен шрифт фиксированной ширины символов

VARIABLE PITCH

Нужен шрифт с переменной шириной символов

Следующие константы задают семейство шрифта:

Константа

Описание

FF_DECORATIVE

Шрифт, содержащий маленькие рисунки (на­пример, Wingdings)

FF_DONTCARE

Семейство шрифта не имеет значения

FF_MODERN

Семейство Modern. Фиксированная ширина сим­волов, Morvr быть засечки (но могут и не быть)

FF_ROMAN

Семейство Roman. Переменная ширина букв, есть засечки

FF_SCRIPT

Семейство Script. Рукописный шрифт

FF_SWISS

Семейство Swiss. Переменная ширина букв, нет засечек

14. IfFaceName - строка с именем шрифта. Длина этой строки не должна превышать 32 символа. Если IfFaceName - пустая строка, используют шрифт, который соответствует по другим атрибутам. Получив запрос, GDI начинает искать шрифт, сравнивая последова­тельно поля IfCharSet, IfPitchAndFamily и IfFaceName. После сравнения этих полей GDI сравнивает высоту букв шрифта, затем поля IfWidth, Ifltalic, IfUnderline и IfStrikeOut.