Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

лекции / Shchupak_Yu._Win32_API_Razrabotka_prilozheniy_dlya_Windows

.pdf
Скачиваний:
0
Добавлен:
11.02.2026
Размер:
13.15 Mб
Скачать

Системы координат и преобразования

71

 

 

 

 

 

int X,

// новая X-координата начала координат области просмотра

 

 

int Y,

// новая Y-координата начала координат области просмотра

 

 

LPPOINT lpPoint // прежнее начало координат области просмотра

 

);

 

 

 

BOOL SetViewportExtEx (

 

 

HDC hdc,

// дескриптор контекста устройства

 

 

int nXExtent,

// новый размер области просмотра по оси X

 

 

int nYExtent,

// новый размер области просмотра по оси Y

 

 

LPSIZE lpSize

// прежние размеры области просмотра

 

);

 

 

Для всех четырех функций в качестве последнего параметра можно передать значение NULL, если сам параметр не используется.

Использование функций SetWindowOrgExи SetViewportOrgEx требует дополнитель ных пояснений. Первая функция устанавливает, какая именно точка логического пространства отображается в точку (0, 0) физического пространства1. Соответствен но, вторая функция устанавливает, какая точка физического пространства отобра жается в точку (0, 0) логического пространства. Но учтите, что одновременное ис пользование обеих функций запрещено! Остановите свой выбор на одной из них, так как обе функции позволяют добиться одного и того же результата.

Пример использования приведенных функций для настройки страничной сис темы координат можно найти в листинге 2.3.

Для упрощения работы программиста Win32 API содержит несколько заготовок страничных систем координат, называемых режимами отображения (mapping modes).

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

Режим отображения контекста устройства выбирается следующей функцией:

int SetMapMode (HDC hDC, int iMapMode);

В этой функции параметр iMapMode задает один из восьми идентификаторов режимов отображения, приведенных в табл. 2.1.

Таблица 2.1. Режимы отображения

Режим отображения

Направление

Направление

Логические

 

ïî îñè x

ïî îñè y

единицы

 

 

 

 

MM_TEXT

Вправо

Âíèç

Пиксел

MM_LOMETRIC

Вправо

Вверх

0,1 ìì

MM_HIMETRIC

Вправо

Вверх

0,01 ìì

MM_LOENGLISH

Вправо

Вверх

0,01 дюйма

MM_HIENGLISH

Вправо

Вверх

0,001 дюйма

MM_TWIPS

Вправо

Вверх

1 / 1440 дюйма

MM_ISOTROPIC

Любое

Любое

Произвольные единицы (x == y)

MM_ANISOTROPIC

Любое

Любое

Произвольные единицы (x != y)

 

 

 

 

1Это эквивалентно такому сдвигу осей, в результате которого точка (0, 0) логического пространства уже не относится к левому верхнему углу окна.

72

Глава 2. GDI — графический интерфейс устройства

 

 

Если функция SetMapMode не вызывалась, то по умолчанию используется ре жим отображения MM_TEXT.

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

Следует отметить, что реальность, однако, не столь радужна, как может пока заться из последнего утверждения. Все получается великолепно до тех пор, пока вы отображаете отдельные точки при помощи функции SetPixel либо используете дру гие графические функции с пером толщиной 1 пиксел. Для этого при вызове функ ции CreatePen аргумент nWidth должен иметь нулевое значение. Но при попытке ри совать линии разной толщины вы столкнетесь с неприятными проблемами. Эти проблемы и пути их решения рассматриваются ниже в разделе «Вывод временной диаграммы напряжения переменного электрического тока» (листинг 2.3).

Мировая система координат

Страничная система координат имеет несколько недостатков, причиной которых являются следующие особенности архитектуры Win16 GDI API:

Дробные коэффициенты при отображении окна на область просмотра, что мо жет приводить к потере точности.

Неполная реализация API. Так, вывод текста не соответствует семантике от ражения относительно оси Y. Другими словами, если приложение направляет ось X справа налево, то текстовые строки все равно выводятся слева направо.

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

ВWindows NT/2000 для решения этих проблем была создана новая логичес кая система координат — мировые координаты. В этой системе координаты зада ются по прежнему в виде 32 разрядных целых чисел, однако появляется возмож ность использования более общих преобразований.

Аффинные преобразования

Преобразования, поддерживаемые в Windows NT/2000, относятся к классу дву мерных аффинных преобразований. Аффинное преобразование отображает па раллельные линии в параллельные линии, а конечные точки — в конечные точки.

Двумерное аффинное преобразование определяется шестью числами, обра зующими матрицу 2 × 3. В Win32 API такие матрицы определяются структурой

XFORM:

typedef struct _XFORM { FLOAT eM11;

FLOAT eM12; FLOAT eM21; FLOAT eM22; FLOAT eDx; FLOAT eDy;

} XFORM;

Системы координат и преобразования

73

 

 

 

Аффинное преобразование, определяемое этими числами, преобразует точку (x, y) в точку (x', y') следующим образом:

x' = eM11 x + eM21 y + eDx; y' = eM12 x + eM22 y + eDy.

Аффинные преобразования позволяют выполнить следующие операции:

Тождественное отображение. Оно определяется матрицей (1, 0, 0, 1, 0, 0). При этом x' = x, а y' = y.

Смещение. Это преобразование определяется матрицей (1, 0, 0, 1, dx, dy). При этом x' = x + dx, а y' = y + dy.

Масштабирование. Задается матрицей (mx, 0, 0, my, 0, 0). Выполняются соот ношения x' = mx x, y' = my y.

Зеркальное отражение. Преобразование задается матрицей (–1, 0, 0, –1, 0, 0). При этом x' = – x, а y' = – y.

Поворот. Определяется матрицей (cos(θ), sin(θ), –sin(θ), cos(θ), 0, 0). При этом существуют соотношения x' = cos(θ) x – sin(θ) y и y' = sin(θ) x + cos(θ) y.

Сдвиг. Определяется матрицей (1, s, 0, 1, 0, 0)1. При этом выполняется соотно шения x' = x + s y и y' = y.

Комбинированные операции. Матрицы нескольких аффинных преобразований объединяются операцией матричного умножения и образуют новое аффинное преобразование.

Функции мировых преобразований в Win32 API (Windows NT/2000)

По умолчанию контекст устройства работает в так называемом совместимом режиме. При этом имеется в виду совместимость с 16 разрядной семантикой GDI. В совместимом режиме мировые координаты не поддерживаются, а един ственной логической системой координат является страничная система. Для использования мировой системы координат приложение должно переключить контекст устройства в графический режим вызовом функции SetGraphicsMode (hDC, GM_ADVANCED). В результате вызова будет обеспечена поддержка двух уровней логического координатного пространства — мировых и страничных координат, а также матрицы преобразования. Чтобы вернуться к совместимо му режиму работы, следует заполнить матрицу данными тождественного пре образования и вызвать функцию SetGraphicsMode(hDC, GM_COMPATIBLE). Кроме того, можно воспользоваться функциями SaveDC и RestoreDC.

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

BOOL SetWorldTransform(HDC hDC, CONST XFORM* lpXform);

BOOL ModifyWorldTransform(HDC hDC, CONST XFORM* lpXform, DWORD iMode);

Функция SetWorldTransform просто заменяет атрибут преобразования в контек сте устройства новым преобразованием, заданным структурой XFORM.

1 Координаты x смещаются на величину, пропорциональную y.

74

Глава 2. GDI — графический интерфейс устройства

 

 

При вызове функции ModifyWorldTransform параметр iMode может принимать одно из трех предопределенных значений:

MTW_IDENTIFY — преобразование приводится к тождественной форме;

MTW_LEFTMULTIPLY — текущее преобразование умножается на матрицу параметра lpXform слева;

MTW_RIGHTMULTIPLY — текущее преобразование умножается на матрицу пара метра lpXform справа.

Для получения информации о текущем преобразовании используется функ ция GetWorldTransform.

Пример использования мировой системы координат приведен в главе 12.

Получение информации о возможностях устройства

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

int GetDeviceCaps(HDC hdc, int nIndex);

Некоторые возможные значения индекса nIndex приведены в табл. 2.21.

Таблица 2.2. Значения параметра nIndex

Индекс

Значение

 

 

DRIVERVERSION

Версия драйвера устройства

TECHNOLOGY

Технология устройства (DT_PLOTTER, DT_RASDISPLAY, DT_RASPRINTER

 

и другие значения)

HORZSIZE

Ширина физического экрана в миллиметрах

VERTSIZE

Высота физического экрана в миллиметрах

HORZRES

Ширина экрана в пикселах

VERTRES

Высота экрана в пикселах

LOGPIXELSX

Число пикселов на 1 логический дюйм по горизонтали

LOGPIXELSY

Число пикселов на 1 логический дюйм по вертикали

BITSPIXEL

Число смежных битов цвета для каждого пиксела

PLANES

Число цветовых плоскостей

NUMBRUSHES

Число кистей, зависящих от устройства

NUMPENS

Число перьев, зависящих от устройства

NUMFONTS

Число шрифтов, зависящих от устройства

NUMCOLORS

Число входов в таблице цветов устройства

CLIPCAPS

Флажок, который указывает возможности отсечения устройства

SIZEPALETTE

Число входов в системной палитре

 

 

1 Полный список возможных значений индекса см. в MSDN.

Получение информации о возможностях устройства

75

 

 

 

 

 

 

 

 

Индекс

Значение

 

 

 

 

 

COLORRES

Фактическая разрешающая способность устройства по цвету в битах

 

 

на пиксел

 

 

PHYSICALWIDTH

Ширина физической страницы (для принтеров) в пикселах

 

 

PHYSICALHEIGHT

Высота физической страницы (для принтеров) в пикселах

 

 

PHYSICALOFFSETX

Смещение в пикселах от левой границы страницы, где фактически

 

 

 

начинается печать

 

 

PHYSICALOFFSETY

Смещение в пикселах от верхней границы страницы, где фактически

 

 

начинается печать

 

 

RASTERCAPS

Растровые возможности устройства. Возвращаемое значение может

 

 

представлять собой комбинацию следующих флагов: RC_BITBLT —

 

 

 

способно передавать растровые изображения; RC_BITMAP64 —

 

 

 

способно поддерживать растровые изображения, превышающие по

 

 

размерам 64 Кбайт; RC_DEVBITS — способно поддерживать аппаратно-

 

 

зависимые изображения; RC_NONE — устройство не имеет растровых

 

 

возможностей; RC_PALETTE — указывает на устройство, действующее

 

 

на основе палитры; RC_SCALING — способно к масштабированию;

 

 

 

RC_STRETCHBLT — способно выполнять функцию StretchBlt;

 

 

 

RC_STRETCHDIB — способно выполнять функцию StretchDiBIts

 

 

CURVECAPS

Возможности вывода кривых. Возвращаемое значение может

 

 

 

представлять собой комбинацию следующих флагов: CC_CHORD —

 

 

 

устройство может выводить дуги хорды; CC_CIRCLES — может

 

 

 

выводить окружности; CC_ELLIPSWS — может выводить эллипсы;

 

 

 

CC_INTERIORS — может закрашивать внутренние области;

 

 

 

CC_NONE — устройство не поддерживает вывод кривых

 

 

LINECAPS

Возможности вывода линий. Возвращаемое значение может

 

 

 

представлять собой комбинацию следующих флагов: LC_STYLED —

 

 

устройство может выводить стилизованные линии; LC_WIDE — может

 

 

выводить широкие линии; LC_POLYLINE — может выводить ломаную

 

 

линию; LC_INTERIORS — может закрашивать внутренние области;

 

 

 

LC_NONE — устройство не поддерживает линии

 

 

POLYGONALCAPS

Возможности вывода многоугольников. Возвращаемое значение

 

 

 

может представлять собой комбинацию следующих флагов:

 

 

 

PC_STYLED — устройство может выводить стилизованные рамки;

 

 

 

PC_WIDE — может выводить широкие рамки; PC_POLYGON — может

 

 

выводить многоугольники; PC_INTERIORS — может закрашивать

 

 

 

внутренние области; PC_NONE — устройство не поддерживает

 

 

 

многоугольники

 

 

TEXTCAPS

Текстовые возможности устройства. Возвращаемое значение может

 

 

представлять собой комбинацию следующих флагов: TC_CR_90 —

 

 

 

устройство способно поворачивать символы на 90°; TC_CR_ANY —

 

 

 

способно поворачивать символы на любой угол; TC_EA_DOUBLE —

 

 

 

может выводить символы с двойным весом; TC_IA_ABLE — может

 

выводить символы курсивом; TC_RA_ABLE — может выводить растровые шрифты; TC_VA_ABLE — может выводить векторные шрифты

Например, если необходимо определить количество пикселов на 1 логический дюйм экрана по вертикали, чтобы рассчитать необходимые размеры создаваемо го шрифта, то это можно сделать в блоке обработки сообщения WM_CREATE:

HDC hdc = GetDC(hwnd);

int logPixelY = GetDeviceCaps(hdc, LOGPIXELY); // используем значение logPixelY ...

ReleaseDC(hwnd, hdc);

76

Глава 2. GDI — графический интерфейс устройства

 

 

Управление цветом. Вывод пиксела

При внимательном рассмотрении можно увидеть что экран дисплея составлен из тонких горизонтальных и вертикальных линий. На пересечении каждой го ризонтальной и вертикальной линии находится точка, называемая Пикселом. Пиксел — это минимальный по размерам изобразительный элемент, которым может управлять приложение.

Всвою очередь, пиксел образован тремя микроточками, не различимыми не вооруженным глазом, которые имеют, соответственно, красный, зеленый и синий цвета. Микроточки могут светиться с интенсивностью от 0 (отсутствие излуче ния) до 255 (максимальная яркость). Совокупность их свечения образует теку щий цвет пиксела.

Таким образом, цвет пиксела можно рассматривать как некоторую точку в трех мерном RGB пространстве, образованном тремя цветовыми осями: Red (красная цветовая составляющая), Green (зеленая составляющая) и Blue (синяя составля ющая).

Вкомпьютерной графике используются и другие цветовые пространства. На пример, для цветных принтеров чаще используется цветовое пространство CMYK,

вкотором каждый цвет является комбинацией голубой, малиновой, желтой и чер ной составляющих.

Для человеческого глаза более привычно различать цвета по их оттенку, ярко сти и насыщенности. Поэтому в графических пакетах более распространенным является использование пространства HLS.

Цветовое пространство HLS

В пространстве HLS цвет описывается через значения оттенка (Hue), яркости (Lightness) и насыщенности (Saturation).

Оттенок измеряется в угловых величинах от 0 до 360°. Нулевое значение со ответствует синему цвету, 60 — малиновому, 120 — красному, 180 — желтому, 240 — зеленому, 300 — голубому.

Яркость описывает интенсивность чистого цвета. Значение яркости находит ся в промежутке от нуля до единицы. Условно говоря, увеличение яркости добав ляет белый цвет к чистому цвету, а уменьшение яркости добавляет черный цвет.

Насыщенность, также изменяемая от нуля до единицы, является мерой «чис тоты» цвета. Если насыщенность уменьшается, то к чистому цвету добавляется больше серого цвета. Нулевое значение насыщенности приводит к шкале серого цвета.

Цветовое пространство RGB

Система Windows поддерживает цветовое пространство RGB и пространство ин дексов палитры, соответствующее базовым возможностям видеоадаптера.

Цвет кодируется в любом из этих пространств при помощи типа данных COLORREF, представляющего четырехбайтное значение. Старший байт задает один из трех возможных форматов: 0 — RGB, 1 — PALETTEINDEX, 2 — PALETTERGB.

Интерпретация формата RGB показана на рис. 2.3.

Управление цветом. Вывод пиксела

77

 

 

 

Рис. 2.3. Тип данных COLORREF, формат RGB

Минимальное значение (0) всех трех составляющих цвета задает черный цвет. Максимальное значение (255) всех трех составляющих цвета задает белый цвет. Комбинируя все возможные значения RGB составляющих, можно получить 224 комбинаций, или примерно 16,7 миллиона возможных цветов.

Win32 API содержит несколько макросов, позволяющих объединять три со ставляющие RGB в одно 32 разрядное значение типа COLORREF либо, наоборот, разделять данные COLORREF на составляющие RGB модели.

Эти макросы, определенные в файле wingdi.h, можно представить в виде сле дующих подставляемых (inline) функций:

COLORREF RGB(BYTE byRed, BYTE byGreen, BYTE byBlue);

BYTE GetRValue(COLORREF rgb);

BYTE GetGValue(COLORREF rgb);

BYTE GetBValue(COLORREF rgb);

Следующий фрагмент кода демонстрирует использование макроса RGB для оп ределения констант, представляющих наиболее часто применяемые «чистые» цвета:

const COLORREF black

= RGB(0, 0, 0);

const COLORREF red

= RGB(255, 0, 0);

const COLORREF green

=

RGB(0,

255, 0);

const

COLORREF

blue

= RGB(0,

0, 255);

const

COLORREF

yellow

=

RGB(255, 255, 0);

const COLORREF magenta = RGB(255, 0, 255);

const

COLORREF

cyan

=

RGB(0, 255, 255);

const

COLORREF

white

=

RGB(255, 255, 255);

//RGB(0x0, 0x0, 0x0);

//RGB(0xFF, 0x0, 0x0);

//RGB(0x0, 0xFF, 0x0);

//RGB(0x0, 0x0, 0xFF);

//RGB(0xFF, 0xFF, 0x0);

//RGB(0xFF, 0x0, 0xFF);

//RGB(0x0, 0xFF, 0xFF);

//RGB(0xFF, 0xFF, 0xFF);

Определение цвета при работе с палитрой

К сожалению, не все устройства способны воспроизводить 16 777 216 цветов из RGB пространства типа COLORREF. Например, все еще встречаются дисплеи ста рых типов, которые могут поддерживать только 256 цветов. В таких случаях для приемлемого качества рисования нужно работать с цветовой палитрой. Вопросы работы с палитрой рассматриваются в главе 3. Здесь же приводятся только фор маты данных для типа COLORREF, которые позволяют работать с палитрой.

Win32 API содержит макросы PALETTEINDEX и PALETTERGB, формирующие зна чения одноименных форматов для типа данных COLORREF. Интерпретация этих фор матов показана на рис. 2.4.

Рис. 2.4. Тип данных COLORREF, форматы PALETTEINDEX и PALETTERGB

78

Глава 2. GDI — графический интерфейс устройства

 

 

Вывод пикселов

Для работы с пикселами предусмотрены следующие функции:

COLORREF GetPixel(HDC hdc, int X, int Y);

BOOL SetPixelV(HDC hdc, int X, int Y, COLORREF color);

COLORREF SetPixel(HDC hdc, int X, int Y, COLORREF color);

Параметры X и Y определяют позицию пиксела в логических единицах. Пара метр color, устанавливающий цвет пиксела, обычно задается при помощи макро са RGB1.

Функция GetPixel возвращает цветовое значение пиксела с заданными коорди натами.

Функции SetPixelV и SetPixel устанавливают заданное цветовое значение пик села, различаясь возвращаемым значением. Первая функция возвращает логичес кое значение, указывающее, успешно ли прошла операция. Вторая функция в слу чае успешного выполнения возвращает старый цвет пиксела, а если произошла какая то ошибка, то возвращается значение –1.

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

блокировку контекста устройства;

отображение логических координат в физические;

преобразование в случае необходимости значения типа COLORREF в индекс;

вызов функции драйвера DrvBitBlt;

разблокировку контекста устройства.

Хронометраж процесса выполнения этих функций [6] показал, что процесс вывода одного пиксела требует более 1000 тактов работы процессора. Как ни стран но, функция GetPixel работает еще медленнее и требует более 6000 тактов работы процессора.

Поэтому, если рисование ведется посредством вывода отдельных пикселов, могут возникнуть проблемы с быстродействием программы. Решение таких про блем рассматривается в главе 12.

Атрибуты контекста устройства, влияющие на рисование

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

1Если приложение работает с логической палитрой, то вместо макроса RGB следует использовать макрос PALETTERGB.

Атрибуты контекста устройства, влияющие на рисование

79

 

 

 

Режим рисования. Бинарные растровые операции

Любую операцию рисования можно разложить на элементарные акты рисования отдельных пикселов. В предыдущем разделе упоминалась функция SetPixel(hDC, x, y, color), которая изменяет текущий цвет пиксела с координатами x и y на цвет color. Но такое определение функции SetPixel не является абсолютно корректным. Точ нее говоря, оно корректно, если приложение не изменяет режим рисования, уста новленный по умолчанию в контексте устройства.

На самом деле в Windows реализована более гибкая технология установки цвета пиксела при рисовании. Эту технологию можно представить как процесс переда чи цвета из источника S (инструмента рисования) в приемник D («холст» или по верхность устройства). Независимо от разновидности инструмента рисования (перо, кисть или функция SetPixel) результат такой передачи определяется как функция f(D, S), то есть представляет собой некоторую комбинацию цвета источ ника и цвета приемника:

D = f(D, S).

Теоретически, число таких функций является бесконечным, но в GDI реали зованы только поразрядные логические операции. Слово «поразрядные» означа ет, что к битам двух аргументов, находящимся в одинаковой позиции, применяет ся одна и та же логическая операция. В Windows поразрядная логическая операция, применяемая к пикселам, носит название растровой операции (raster operation (ROP)). А поскольку эта операция применяется к двум аргументам, то ее называ ют бинарной растровой операцией (binary raster operation (ROP2)).

В MSDN при описании бинарных растровых операций в качестве источника рассматривается только один инструмент рисования — перо P, поэтому приведен ная выше формула имеет следующий вид:

D = f(D, P).

Однако все бинарные растровые операции, приведенные в табл. 2.3, имеют ана логичное действие и для альтернативных инструментов рисования, таких как кисть или функция SetPixel.

Таблица 2.3. Бинарные растровые операции

P:

1 1 0 0

Формула

ROP2

Описание

D:

1 0 1 0

 

 

 

 

 

 

 

 

Ð

0 0 0 0

D = 0

R2_BLACK

Всегда 0 (черный цвет)

å

 

 

 

 

 

0 0 0 1

D = ~(D | P)

R2_NOTMERGEPEN

Инверсия R2_MERGEPEN

ç

 

 

 

 

 

0 0 1 0

D = D & ~P

R2_MASKNOTPEN

Конъюнкция приемника

ó

 

 

 

 

 

 

 

 

с инвертированным пером

ë

 

 

 

 

ü

0 0 1 1

D = ~P

R2_NOTCOPYPEN

Инверсия цвета пера

ò

 

 

 

 

 

0 1 0 0

D = P & ~D

R2_MASKPENNOT

Конъюнкция пера с инвертирован-

à

 

 

 

 

 

 

 

 

ным приемником

ò

 

 

 

 

 

0 1 0 1

D = ~D

R2_NOT

Инверсия приемника

û

 

 

 

 

 

0 1 1 0

D = D ^ P

R2_XORPEN

Исключающее «ИЛИ» для

 

 

 

 

приемника и пера

 

0 1 1 1

D = ~(D & P)

R2_NOTMASKPEN

Инверсия R2_MASKPEN

 

1 0 0 0

D = D & P

R2_MASKPEN

Конъюнкция приемника с пером

 

 

 

 

 

продолжение

80

 

Глава 2. GDI — графический интерфейс устройства

 

 

 

Таблица 2.3 (продолжение)

 

 

 

 

 

 

P: 1 1 0 0

Формула

ROP2

Описание

D:1 0 1 0

Ð

1 0 0 1

D = ~(D ^ P)

R2_NOTXORPEN

Инверсия R2_XORPEN

å

 

 

 

 

 

1 0 1 0

D = D

R2_NOP

Приемник не изменяется

ç

 

 

 

 

 

1 0 1 1

D = D | ~P

R2_MERGENOTPEN

Дизъюнкция приемника

ó

 

 

 

 

 

 

 

 

с инвертированным пером

ë

 

 

 

 

ü

1 1 0 0

D = P

R2_COPYPEN

Цвет пера (значение по умолчанию)

ò

 

 

 

 

 

1 1 0 1

D = P | ~D

R2_MERGEPENNOT

Дизъюнкция пера с инвертирован-

à

 

 

 

 

 

 

 

 

ным приемником

ò

 

 

 

 

 

1 1 1 0

D = P | D

R2_MERGEPEN

Дизъюнкция пера с приемником

û

 

 

 

 

 

1 1 1 1

D = 1

R2_WHITE

Всегда 1 (белый цвет)

 

 

 

 

 

Контекст устройства GDI содержит атрибут, называемый режимом рисования (drawing mode). Он определяет текущую операцию ROP2.

Режим рисования можно установить при помощи функции SetROP2:

int SetROP2(HDC hdc, int fnDrawMode);

При вызове функции параметру fnDrawMode передается одно из значений ROP2, приведенных в табл. 2.3. Функция возвращает предыдущий режим рисования. Для получения текущего режима рисования можно воспользоваться функцией GetROP2.

По умолчанию в контексте устройства установлен режим R2_COPYPEN, при ко тором пикселу приемника просто присваивается цвет пера.

При использовании бинарных растровых операций следует помнить о том, что если в устройстве используется цветовое пространство RGB, то операции приме няются к каждой из трех составляющих RGB модели. Поэтому результат всегда предсказуем, но не всегда может быть оправдан с точки зрения логики цветового восприятия. Например, если в контексте устройства выбрано перо красного цве та (RGB(0xFF, 0, 0)) и установлен режим рисования R2_XORPEN, то при рисова нии на белом фоне (RGB(0xFF, 0xFF, 0xFF)) результирующая линия будет иметь цвет морской волны(cyan), поскольку операция «Исключающее ИЛИ» для при емника и пера даст результат RGB(0, 0xFF, 0xFF). Интересно, что при повторном выводе линии на том же месте будет нарисована линия белого цвета, то есть вос становится первоначальное состояние приемника. На этом полезном свойстве ре жима рисования R2_XORPEN основан вывод «эластичных прямоугольников».

Для устройств с палитрой растровые операции применяются к цветовым ин дексам, поэтому результат зависит от упорядочения цветов в палитре.

Бинарные растровые операции играют важную роль в компьютерной графике. Режим R2_BLACK используется для закраски пикселов черным цветом, а режим R2_WHITE — белым цветом. Режим R2_NOTCOPYPEN меняет цвет пера на противопо ложный. Режим R2_NOP полностью подавляет вывод линий и кривых — это удобно, если вы не хотите обводить прямоугольник рамкой.

Режимы R2_XORPEN и R2_NOTXORPEN часто используются в интерактивной ком пьютерной графике для вывода эластичных контуров или движущихся изобра жений. Эластичные прямоугольники, например, используются для выделения с помощью мыши некоторых областей на изображении. В процессе перемещения мыши построение фигуры считается не законченным, поэтому приложение дол жно быстро стереть прежнюю версию контура и нарисовать его в новой позиции. Бинарные операции R2_XORPEN и R2_NOTXORPEN позволяют легко реализовать эту функциональность, поскольку при повторном выводе линии восстанавливается