Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
экзамен СП.docx
Скачиваний:
13
Добавлен:
22.04.2019
Размер:
515.86 Кб
Скачать

Х.4 Основные инструменты графической подсистемы

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

(Похожим образом был организован и упоминавшийся BGI. Ее функции рисования использовали единые централизованно устанавливаемые параметры.).

Инструменты также являются системными объектами, но прикладная программа может произвольно создавать их и управлять ими. Как обычно, инструмент идентифицируется его описателем, тип данных HGDIOBJ (handle GDI object).

К основным инструментам относятся:

– "перо" или "карандаш" (Pen) – контурные примитивы (в переводе чаще употреб­ляется термин "карандаш");

– "кисть" (Brush) – закраска (штриховка) внутренних областей примитивов;

– "шрифт" (Font) – символы и строки;

– "битовая карта" (Bitmap) – "готовые" растровые изображения

Инструменты создаются соответствующими специфическими функциями вида Create..., возвращающими их описатели (NULL как признак ошибки). Количество создаваемых инструментов искусственно не ограничивается, но в любом контексте одновременно может быть активным только один инструмент каждого типа. Для установки инструмента в качестве активного в данном контексте служит универсальная функция SelectObject, принимающая описатель нового инструмента и самостоятельно определяющая его тип, при этом возвращается описатель того инструмента, который в результате был замещен. Выбор инструмента отменить нельзя, но можно повторять его сколько угодно раз с любыми другими инструментами того же типа. Инструменты различного типа между собой взаимно независимы. Функция DeleteObject удаляет созданные инструменты. Перед удалением инструмент следует дезактивировать, выбрав активным другой того же типа (например, сохраненный предыдущий). Пользоваться удаленным инструментом, очевидно, нельзя; поэтому, временно заместив инструменты, установленные для контекста изначально, обязательно нужно восстановить их перед удалением замещающих.

Информация о любом инструменте может быть получена с помощью функции GetObject, аргументами которой являются контекст, буфер для сохранения данных и его размер. Данные записываются в буфер в виде структур LOGPEN, LOGBRUSH, LOGFONT и т.д.

Рассмотрим примеры создания инструментов.

.1 Инструмент Pen

Инструмент служит для отображения контурных примитивов

Функция CreatePen()

Действие: создание пера (карандаша) с заданными параметрами

Формат функции:

HPEN CreatePen(int fStyle,int nWidth,COLORREF crColor

Возвращаемое значение: описатель созданного инструмента или NULL.

Параметры:

fStyle – стиль пера, может принимать значения: PS_SOLID (сплошная линия), PS_DASH, PS_DOT, PS_DASHDOT, PS_DASHDOTDOT (штриховые, пунктирные и штрихпунктирные), PS_NULL ("пустое", нерисующее перо), PS_INSIDEFRAME (внутренняя обводка: в замкнутом контуре автоматически отступает внутрь в соответствии с толщиной линии).

nWidth – толщина линии пера в логических единицах, по умолчанию в пикселах; значение 0 соответствует толщине 1 пиксел независимо от установленного режима отображения.

crColor – цвет линии пера; тип COLORREF совместим с 32-разрядным целым, хранит 3 однобайтовые цветовые компоненты модели RGB, либо информацию для палитрового преобразования; может быть получен, например, с помощью функции (макроса) RGB, аргументами которой являются цветовые компоненты.

Функция ExtCreatePen()

Действие: создание пера с расширенными возможностями

Формат функции:

HPEN CreatePen(

DWORD fStyle,DWORD nWidth,const LOGBRUSH lpPenBrush,

DWORD dwPatternCount,const DWORD* lpPattern

)

Возвращаемое значение: описатель созданного инструмента или NULL.

Параметры:

fStyle – стиль пера, комбинация по ИЛИ нескольких групп значений:

тип пера: PS_GEOMETRIC (точная отрисовка), PS_COSMETIC (упрощенная);

стиль: к набору значений предыдущей функции добавляются PS_ALTERNATE (воздействует на каждый второй? пиксел, в Window NT работает только для "косметических" перьев, в Window 9x не поддерживается) и PS_USERSTYLE (произвольная штриховая линия, штрихи задаются отдельным массивом, в Window 9x не поддерживается); штриховые стили в Windows 9x поддерживаются только для "косметических" перьев;

тип концов отрезков: PS_ENDCAP_ROUND, PS_ENDCAP_SQUARE, PS_ENDCAP_FLAT;

тип соединений: PS_JOIN_BEVEL, PS_JOIN_MITER, PS_JOIN_ROUND.

nWidth – толщина линии пера.

lpPenBrush – структура данных кисти (см. ниже), используемой для отрисовки линии пера; для пера "cosmetic" используется только компонента цвета и принудительно устанавливается "сплошная" кисть.

dwPatternCount – число элементов в массиве описания шаблона (только для стиля PS_USERSTYLE), или 0.

lpdwPattern – массив двойных слов, описывающий шаблон, в формате: <длина_штриха>-<длина_пропуска>-<длина_штриха>-....

Функции CreatePenIndirect(const LOGPEN* lplgPen) и CreateExtPenIndirect(const LOGEXTPEN* lplgExtPen) отличаются тем, что вместо полного списка атрибутов пера передаются специальные структуры LOGPEN и LOGEXTPEN, содержащие поля аналогичного назначения; в ряде случаев это более предпочтительно.

.2 Инструмент Brush

Функция CreateBrushIndirect()

Действие: создание кисти с заданными параметрами

Формат функции:

HPEN CreateBrushIndirect(const LOGBRUSH* lplgBrush)

Возвращаемое значение: описатель созданного инструмента или NULL.

Параметр: структура LOGBRUSH, содержащая поля:

UINT lbStyle – стиль (тип) кисти: BS_SOLID ("сплошная" кисть), BS_HOLLOW, BS_NULL ("пустая", невидимая кисть), BS_HATCHED ("штрихованная" кисть), BS_PATTERN, BS_PATTERN8X8 (задается битовой картой), BS_DIBPATTERN, BS_DIBPATTERN8X8, BS_DIBPATTERNPT (задается битовой картой DIB, в Windows 95 размер шаблона ограничен 88 точек).

COLORREF lbColor – цвет кисти; для пустой или "шаблонной" кисти игнорируется; для кистей с DIB-шаблоном младшее слово определяет, следует ли интерпретировать его цвета как заданные цветовыми компонентами (DIB_RGB_COLORS) или как палитровые (DIB_PAL_COLORS);

LONG lbHatch – тип штриховки для штрихованной кисти: HS_HORIZONTAL, HS_VERTICAL, HS_BDIAGONAL (диагональная слева направо вверх), HS_FDIAGONAL (диагональная слева направо вниз), HS_CROSS (прямая сетка), HS_DIAGCROSS (диагональная сетка), или описатель шаблона, или описатель шаблона DIB (BS_DIBPATTERN, BS_DIBPATTERN8X8), или указатель на шаблон DIB (BS_DIBPATTERNPT);

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

COLORREF SetBkColor(HDC hdc, COLORREF crColor);

COLORREF GetBkColor(HDC hdc);

Функции соответственно устанавливают новое или получают текущий фоновый цвета. Признаком ошибки является возвращенное значение CLR_INVALID. Функция SetBkColor возвращает значение предыдущего цвета. Установка цвета эффективна, если устройство (контекст) реально его поддерживает.

Фон может быть сделан "прозрачным" (невидимым), что достигается установкой соответствующего режима его отрисовки. Возможны 2 режима: OPAQUE (сначала рисуется фон, затем передний план) и TRANSPARENT (фон не отрисовывается). Используются следующие функции:

int SetBkMode(HDC hDC,int iBkMode);

int GetBkMode(HDC hDC);

Признаком ошибки служи возвращенное нулевое значение.

.3 Инструмент Font

Более сложным инструментом является шрифт. Все символы в оконном интерфейсе формируются в соответствии с одним из зарегистрированных в системе шрифтов.

(Шрифтовая модель Windows. Font Mapper. Растровые и векторные шрифты. Гарнитура, кегль, питч, кернинг, интерлиньяж и т.д. Соответствие имен и гарнитур, подмена, совместимость.)

Физический шрифт – файл (образ в памяти) с описанием начертаний всех символов, известных в данном шрифте. Логический шрифт – объект GDI, характеризуемый как применяемым физическим шрифтом, так и его конкретными количественными характеристиками. Он же является и инструментом, отвечающим за формирование символов.

Функция CreateFont()

Действие: создание логического шрифта.

Формат функции:

HFONT CreateFont(

int nHeight, int nWidth,

int nEscapement, int nOrientation,

int fnWeight,

DWORD fdwItalic, DWORD fdwUnderline, DWORD fdwStrikeOut,

DWORD fdwCharSet,

DWORD fdwOutputPrecision, DWORD fdwClipPrecision, DWORD fdwQuality,

DWORD fdwPitchAndFamily,

LPCTSTR lpszFace

);

Возвращаемое значение: описатель созданного инструмента или NULL.

Параметры:

nHeight – основной размер (высота, em-height) шрифта в логических единицах, значение интерпретируется следующим образом: положительное – высота знакоместа, отрицательное – высота шрифта (после смены знака), нулевое – размер по умолчанию; при неточном соответствии требуемого размера доступным выбирается наибольший не превышающий требуемый.

nWidth – "приблизительная" ширина шрифта (ex-width); если 0, то стандартная для выбранного основного размера.

nEscapement – направление вывода строки символов, определяется как угол между базовой линией и горизонтальной осью по часовой стрелке в десятых долях градуса;

nOrientation – ориентация отдельного символа, исчисление аналогично предыдущему параметру; в Windows 9x ориентация символов и направление вывода должны совпадать.

fnWeight – толщина символов в условных единицах от 0 до 1000, например: 0 (FW_DONTCARE) – стандартный, по умолчанию, 400 (FW_NORMAL, FW_REGULAR) – стандартная толщина, обычный шрифт, 700 (FW_BOLD) – жирный, выделенный (в русифицированный приложениях обычно "полужирный"), и т.д.

fdwItalic, fdwUnderline, fdwStrikeOut – флаги, указывающие, является ли шрифт наклонным, подчеркнутым или перечеркнутым.

fdwCharSet – тип символьного набора (charset): DEFAULT_CHARSET, ANSI_CHARSET, OEM_CHARSET и т.д., в основном национальные наборы символов, например, русский, восточноевропейский, китайский; поддержка конкретных наборов зависит от операционной системы, а также применяемого физического шрифта.

fdwOutputPrecision – "точность вывода" символов, фактически предпочтение типа шрифта при наличии альтернативного выбора: OUT_DEFAULT_PRECIS, OUT_­DEVICE_PRECIS, OUT_RASTER_PRECIS, OUT_TT_PRECIS, OUT_TT_ONLY_PRECIS и т.д.

fdwClipPrecision – "точность отсечения"; большинство значений в настоящее время не используются (безразличны), поведение по умолчанию – CLIP_DEFAUL_PECIS.

fdwQuality – "качество" вывода, точнее степень предпочтительности визуального качества по сравнению с точностью воспроизведения прочих параметров: DEFAULT_QUALITY, DRAFT_QUALITY, PROOF_QUALITY.

fdwPitchAndFamily – комбинация по ИЛИ 2 групп параметров, действующих при неопределенном имени шрифта:

– питч (шаг символов) – 2 младших бита: DEFAULT_PITCH, FIXED_PITCH, VARIABLE_PITCH;

– "семейство" шрифта – 4 старших бита: FF_DONTCARE (по умолчанию), FF_MODERN (моноширинные шрифты с засечками и без), FF_ROMAN ("книжные" с засечками, переменный шаг), FF_SWISS (без засечек, переменный шаг), FF_SCRIPT ("рукописные" и курсивные), FF_DECORATIVE (не вполне понятная характеристика из документации: "Novelty fonts. Old English is an example.").

lpszFace – имя шрифта, как правило, совпадает с именем его дискового файла; если NULL, то система подбирает шрифт, наиболее отвечающий заданным требованиям, иначе явно указанный шрифт перекрывает их.

Базовая линия (base line) символа проходит по верхней границе знакоместа слева направо (в "системе координат" символа). В этой связи необходимо отметить некоторые особенности. Во-первых, отсчет угла между базовой линией и горизонтальной осью всегда идет по часовой стрелке в действующей системе координат, вследствие чего зрительно в режиме MM_TEXT поворот происходит в обратную сторону. Направление отсчета угла поворота обратно принятому на стандартном "тригонометрическом круге"! Во-вторых, символы всегда, независимо от режима, расположены в собственной "локальной системе координат" под базовой линией, т.е. при любой ориентации нижняя часть символа отклонена от нее на 90 зрительно вправо, что необходимо учитывать в "многорежимных" программах.

Функция CreateFontIndirect(const LOGFONT* lplgFont) отличается тем, что использует в качестве аргумента структуру с полями аналогичного назначения.

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

COLORREF SetTextColor(HDC hDC, COLORREF crColor).

COLORREF GetTextColor(HDC hDC);

Кроме того, знакоместо символа, не занятое его образом, считается фоном, цветом и прозрачностью которого можно управлять (см. выше).

Базовой функцией вывода символа является:

BOOL TextOut(HDC hdc, // handle of device context

int nXStart,int nYStart,

LPCTSTR lpString,

int cbString

);

Позицией символа считается верхний левый угол его знакоместа.

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

BOOL GetCharWidth(

HDC hdc,UINT iFirstChar,UINT iLastChar,LPINT lpBuffer

);

BOOL GetCharWidth32(

HDC hdc,UINT iFirstChar,UINT iLastChar,LPINT lpBuffer

);

BOOL GetCharWidthFloat(

HDC hdc,UINT iFirstChar,UINT iLastChar,PFLOAT pxBuffer

);

Действие функций: заполняют массив значениями ширин символов с номерами из заданного диапазона iFirstChar... iLastChar, выводимых текущим в данном контексте шрифтом. Целочисленные ширины отсчитываются в логических координатах. Вещественный формат имеет разрядность 32 бит в соответствии с IEEE.

Возвращаемое значение: признак успешности операции.

Более подробная информация может быть получена с помощью структуры ABC, имеющей следующие поля:

int abcA – т.н. "A"-spacing, отступ слева до начала видеобраза символа;

UINT abcB – "B"-spacing, ширина видеобраза символа;

int abcC – "B"-spacing, отступ справа после видеобраза символа.

Сумма всех трех значений дает общую ширину символа вместе с зазорами. Отступы "A" и "C" могут быть как положительными (символы отделены друг от друга), так и отрицательными (наложение символов).

Функция GetCharABCWidths действует подобно GetCharWidth, но заполняет массив структур ABC:

BOOL GetCharABCWidths(

HDC hdc, UINT uFirstChar, UINT uLastChar, LPABC lpabc

);

Функция нормально работает только со шрифтами TrueType.

Для преобразования значений полей ABC в логические единицы измерения используется поле omtSquare структуры OUTLINETEXTMETRIC. Там же содержится наиболее полная информация о действующем шрифте.

Наиболее "употребимые" параметры шрифта, включая вертикальные размеры, содержатся в структуре TEXTMETRIC (включена в OUTLINETEXTMETRIC). Все размеры в логических единицах измерения:

LONG tmHeight – полный вертикальный размер символов (знакоместа), равен (ascent+descent);

LONG tmAscent, LONG tmDescent – вертикальный размер символа выше и ниже линии основания (base line);

LONG tmInternalLeading – пробельное (свободное от видеобраза символа) пространство внутри знакоместа по высоте;

LONG tmExternalLeading – зазор по высоте между знакоместами (строками знакомест);

LONG tmAveCharWidth – типовая средняя ширина символа данного шрифта, т.н. ex-width (за единицу принимается ширина символа 'x');

LONG tmMaxCharWidth – наибольшая ширина символов данного шрифта;

LONG tmWeight – "жирность" шрифта;

LONG tmOverhang – дополнительный зазор по ширине, добавляемый к строками при некоторых "синтезированных" шрифтах, например, полужирном или наклонном;

LONG tmDigitizedAspectX, LONG tmDigitizedAspectY – показатели пропорциональности горизонтальных и вертикальных размеров для данного устройства;

BCHAR tmFirstChar, BCHAR tmLastChar – первый и последний символы в данном шрифте;

BCHAR tmDefaultChar – "символ по умолчанию", заменитель для образов символов, отсутствующих в шрифте;

BCHAR tmBreakChar – символ – разделитель слов в тексте;

BYTE tmItalic, BYTE tmUnderlined, BYTE tmStruckOut – флаги наклонного, подчеркнутого и перечеркнутого шрифта;

BYTE tmPitchAndFamily – "тип и семейство" шрифта, комбинация битовых полей:

4 младших разряда – шаг и технология: TMPF_FIXED_PITCH (моноширинный шрифт), TMPF_VECTOR (векторный шрифт), TMPF_TRUETYPE (шрифт TrueType), TMPF_DEVICE (шрифт, зависимый от устройства, device font); интерпретация комбинированных значений может быть неочевидной, например, шрифты PostScript и TrueType маркируются векторными, но PostScript будет также и "device";

4 старших разряда – семейство шрифта, описываемое константами (см. выше): FF_DONTCARE, FF_MODERN, FF_ROMAN, FF_SWISS, FF_SCRIPT, FF_DECORATIVE;

BYTE tmCharSet – набор символов (см. выше);

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

Заполнение указанных структур осуществляется функциями:

BOOL GetTextMetrics(

HDC hdc, //контекст

LPTEXTMETRIC lptm //заполняемый буфер (структура)

);

UINT GetOutlineTextMetrics(

HDC hdc, //контекст

UINT cbData, //размер буфера

LPOUTLINETEXTMETRIC lpOTM //заполняемый буфер (структура)

);

Для обоих функций возвращаемое значение TRUE (не ноль) при успешном завершении и FALSE при ошибке.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]