Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Programming_Windows_95_Part_I.pdf
Скачиваний:
96
Добавлен:
05.06.2014
Размер:
4.61 Mб
Скачать

97

В приведенной ниже таблице показаны 16 ROP2 режимов рисования. В таблице показано, как цвет пера (P) комбинируется с цветом приемника (D) для получения результирующего цвета. Столбец с заголовком "Булева операция" (Boolean Operation) использует нотацию языка C, показывающую, как комбинируются пиксели пера и приемника.

Перо (Pen (P)):

1

1

0

0

Булева

Режим

Приемник (Destination (D)):

1

0

1

0

операция

рисования

 

 

 

 

 

(Boolean

(Drawing mode)

 

 

 

 

 

operation)

 

Результаты: (Results)

0

0

0

0

0

R2_BLACK

 

0

0

0

1

~(P | D)

R2_NOTMERGEPEN

 

0

0

1

0

~P & D

R2_MASKNOTPEN

 

0

0

1

1

~P

R2_NOTCOPYPEN

 

0

1

0

0

P & ~D

R2_MASKPENNOT

 

0

1

0

1

~D

R2_NOT

 

0

1

1

0

P ^ D

R2_XORPEN

 

0

1

1

1

~(P & D)

R2_NOTMASKPEN

 

1

0

0

0

P & D

R2_MASKPEN

 

1

0

0

1

~(P ^ D)

R2_NOTXORPEN

 

1

0

1

0

D

R2_NOP

 

1

0

1

1

~P | D

R2_MERGENOTPEN

 

1

1

0

0

P

R2_COPYPEN

 

 

 

 

 

 

(по умолчанию)

 

1

1

0

1

P | ~D

R2_MERGEPENNOT

 

1

1

1

0

P | D

R2_MERGEPEN

 

1

1

1

1

1

R2_WHITE

Вы можете установить новый режим рисования в контексте устройства:

SetROP2(hdc, iDrawMode);

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

iDrawMode = GetROP2(hdc);

По умолчанию в контексте устройства режим рисования устанавливается в R2_COPYPEN, что означает простой перенос цвета пера в приемник. В режиме R2_NOTCOPYPEN рисование ведется белым цветом, если перо черное, и черным — если перо белое. В режиме R2_BLACK рисование ведется всегда черным цветом независимо от цвета пера или фона. Аналогично, в режиме R2_WHITE рисование ведется всегда белым цветом. Режим R2_NOP означает "нет операции": в этом режиме приемник остается неизменным.

Мы начали с рассмотрения примера работы на чисто монохромной системе. В действительности же, на монохромном дисплее Windows может отображать оттенки серого путем смешения черных и белых пикселей. При рисовании пером на таком полутоновом фоне Windows просто осуществляет поразрядные операции по принципу пиксель с пикселем. В режиме R2_NOT рисование ведется цветом, обратным цвету приемника, независимо от цвета пера. Этот режим используется тогда, когда вы не знаете цвет фона, потому что он гарантирует, что пиксели всегда будут видимы. (Ну, почти гарантирует — если фон на 50% серый, то перо будет практически невидимым.) В программе BLOKOUT в главе 6 будет продемонстрировано использование R2_NOT.

Рисование закрашенных областей

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

Функция

Фигура

Rectangle

Прямоугольник

Ellipse

Эллипс

RoundRect

Прямоугольник со скругленными углами

Chord

Дуга кривой эллипса, концы которой соединены хордой

Pie

Кусок, вырезанный из эллипса

Polygon

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

PolyPolygon

Множество многоугольников

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

98

Фигура закрашивается текущей кистью, выбранной в контексте устройства. По умолчанию, это стандартная кисть WHITE_BRUSH. Следовательно, внутренняя область фигуры будет закрашена белым цветом. Windows имеет шесть стандартных (stock) кистей: WHITE_BRUSH (белая кисть), LTGRAY_BRUSH (светло-серая кисть), GRAY_BRUSH (серая кисть), DKGRAY_BRUSH (темно-серая кисть), BLACK_BRUSH (черная кисть) и NULL_BRUSH или HOLLOW_BRUSH (пустая кисть).

Вы можете выбрать одну из стандартных кистей в контекст устройства точно также, как и стандартное перо. Windows определяет HBRUSH как описатель кисти, поэтому вам следует сначала определить переменную типа описателя кисти:

HBRUSH hBrush;

Вы можете получить описатель кисти GRAY_BRUSH, вызвав GetStockObject:

hBrush = GetStockObject(GRAY_BRUSH);

Вы можете выбрать эту кисть в контекст устройства, вызвав SelectObject:

SelectObject(hdc, hBrush);

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

SelectObject(hdc, GetStockObject(NULL_PEN));

Если вы хотите нарисовать только контур фигуры без закрашивания внутренней области, выберите кисть NULL_BRUSH в контекст устройства:

SelectObject(hdc, GetStockObject(NULL_BRUSH));

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

Функция Polygon и режим закрашивания многоугольника

Первые пять функций рисования многоугольников мы уже рассмотрели. Функция Polygon — шестая из функций рисования ограниченных и закрашенных фигур. Вызов этой функции очень похож на вызов функции Polyline:

Polygon(hdc, pt, iCount);

Параметр pt — это массив структур типа POINT, iCount — число точек. Если последняя точка в массиве не совпадает с первой, то Windows добавляет линию, соединяющую последнюю и первую точки. (Функция Polyline этого не делает.)

Windows закрашивает внутреннюю область фигуры текущей кистью, учитывая, какой из режимов закрашивания многоугольников установлен текущим в контексте устройства. По умолчанию режим закрашивания равен ALTERNATE (попеременный), означающий, что Windows закрашивает только те фрагменты внутренней области многоугольника, которые получаются путем соединения линий с нечетными номерами (1, 3, 5 и т. д.). Другие фрагменты внутренней области не закрашиваются. Вы можете установить режим закрашивания WINDING (сквозной), в котором Windows закрашивает все внутренние области. Вы устанавливаете режим закрашивания так:

SetPolyFillMode(hdc, iMode);

Для иллюстрации режимов закрашивания рассмотрим пример с пятиконечной звездой. На рис. 4.17 звезда, находящаяся слева, нарисована в режиме ALTERNATE, а звезда, находящаяся справа — в режиме WINDING.

Рис. 4.17 Фигуры, нарисованные в двух режимах закрашивания многоугольника: ALTERNATE (слева) и

WINDING (справа)

99

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

Внутренняя область фигур, соответствующих функциям Rectangle, RoundRect, Ellipse, Chord, Pie, Polygon и PolyPolygon закрашивается текущей кистью (или шаблоном "pattern"), выбранной в контексте устройства. Кисть — это 8× 8 битовый образ, который размножается в горизонтальном и вертикальном направлении при закрашивании области.

Когда Windows использует полутона для отображения большего числа цветов, чем доступно на дисплее, она использует кисть. На монохромных системах Windows может использовать полутона, состоящие из черных и белых пикселей, для создания 64 разных оттенков серого. Более точно, Windows может создать 64 различных монохромных кисти. Для чистого черного цвета все биты в 8х8 растровом образе равны 0. Для получения первого оттенка серого один из 64 битов устанавливается в 1 (т. е. делается белым); два бита для получения второго оттенка серого и т. д. до тех пор, пока все биты не будут установлены в 1 для чисто белого цвета. На цветных видеосистемах полутона — это тоже битовые образы, но с гораздо более широким набором доступных цветов.

Windows содержит четыре функции, позволяющие вам создавать логические кисти. Выбор кисти в контекст устройства осуществляется функцией SelectObject. Так же как и логические перья, логические кисти — тоже объекты GDI. Любая кисть, созданная вами, должна быть удалена. Но нельзя удалять кисть до тех пор, пока она выбрана в контексте устройства.

Ниже приведена функция для создания логической кисти:

hBrush = CreateSolidBrush(rgbColor);

Слово "solid" в имени функции означает, что создается кисть, имеющая чистый цвет. Когда вы выбираете кисть в контекст устройства, Windows создает 8× 8 битовый образ для полутонов и использует его для кисти.

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

hBrush = CreateHatchBrush(iHatchStyle, rgbColor);

Параметр iHatchStyle задает стиль штриховки. Он может принимать одно из следующих значений: HS_HORIZONTAL, HS_VERTICAL, HS_FDIAGONAL, HS_BDIAGONAL, HS_CROSS и HS_DIAGCROSS. На рис. 4.18 показан фрагмент штриховки для каждого из указанных стилей.

HS_HORIZONTAL

HS_BDIAGONAL

HS_VERTICAL

HS_CROSS

HS_FDIAGONAL

HS_DIAGCROSS

Рис. 4.18

Шесть стилей штриховки для кисти

Параметр rgbColor функции CreateHatchBrush задает цвет штриховых линий. Когда вы выбираете кисть в контекст устройства, Windows преобразует этот цвет к ближайшему чистому цвету. Промежутки между штриховыми линиями закрашиваются в соответствии с режимом фона и цветом фона, определенными в контексте устройства. Если режим фона равен OPAQUE, то цвет фона, который преобразуется к ближайшему чистому цвету, используется для закрашивания промежутков между штриховыми линиями. В этом случае ни штриховые линии, ни цвет фона не могут быть полутонами. Если режим фона равен TRANSPARENT, то Windows рисует штриховые линии и не зарисовывает промежутки между ними.

В связи с тем, что кисти — это всегда битовые матрицы 8× 8, внешний вид штриховых кистей сильно зависит от разрешения устройства, на котором они отображаются. Каждый из образцов, приведенных на рис. 4.18, изображен в прямоугольной области размером 32× 16 пикселей, т. е. битовый образ размером 8× 8 был повторен четыре раза по горизонтали и два раза по вертикали. На лазерном принтере с разрешением 300 точек на дюйм такие же 32х16 пиксельные прямоугольники будут иметь размер 1/9 дюйма в ширину и 1/19 дюйма в высоту.

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

CreatePatternBrush:

hBrush = CreatePatternBrush(hBitmap);

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

Windows также содержит функцию, включающую в себя три других функции, строящих кисти (CreateSolidBrush, CreateHatchBrush, CreatePatternBrush):

hBrush = CreateBrushIndirect(&logbrush);

Соседние файлы в предмете Операционные системы