Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
WinAPI.docx
Скачиваний:
49
Добавлен:
16.12.2018
Размер:
3.43 Mб
Скачать

4.4.5 Закрашивание пустот

Использование точечных и штриховых перьев ставит интересный вопрос: что будет с пустотами между точками и штрихами? Цвет этих пробелов или пустот зависит от режима фона (background mode) и атрибутов цвета фона, определенных в контексте устройства. Режим фона по умолчанию равен OPAQUE, т. е. Windows заполняет пустоты цветом фона, который, по умолчанию, белый. Это согласуется с работой стандартной кисти WHITE_BRUSH, которую многие программы используют в классе окна для стирания фона окна.

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

SetBkColor(hdc, rgbColor);

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

Вы можете также отменить заполнение пустот системой Windows, изменив режим фона на TRANSPARENT:

SetBkMode(hdc, TRANSPARENT);

Windows будет игнорировать цвет фона и не будет заполнять пустоты. Вы можете определить текущий режим фона (как TRANSPARENT, так и OPAQUE), путем вызова GetBkMode.

4.4.6 Режимы рисования

Представление линий, отображаемых на дисплее, зависит также от режима рисования (drawing mode), установленного в контексте устройства. Представление цветной линии основывается не только на цвете пера, но и на цвете той области дисплея, где эта линия отображается. Подумайте о возможности использовать одно и то же перо для рисования черной линии на белом фоне и белой линии на черном фоне без знаний о том, какого цвета фон. Было бы это для вас удобным? Вы можете все проверить, применяя различные режимы рисования. Когда Windows использует перо для рисования линии, на самом деле осуществляется поразрядная логическая операция между пикселями пера и пикселями принимающей поверхности устройства. Выполняемая поразрядная логическая операция над пикселями носит название "растровой операции" (raster operation или ROP). Поскольку рисование линий требует только двух пиксельных шаблонов (пера и приемной поверхности), логическая операция называется "бинарной растровой операцией" (binary raster operation или ROP2). Windows определяет 16 ROP2 кодов, показывающих, как Windows оперирует с пикселями пера и приемника. В контексте устройства по умолчанию режим рисования определяется как R2_COPYPEN, что означает простое копирование системой Windows пикселей пера в приемник и является привычным при работе с перьями. Существует также еще 15 других ROP2 кодов.

Откуда взялись эти 16 различных ROP2 кодов? Для того, чтобы показать зачем они введены, рассмотрим монохромную систему. Цвет приемника (цвет рабочей области окна) может быть либо черным (0) либо белым (1). Перо также может быть либо белым, либо черным. Существует четыре комбинации использования черного или белого пера на черном или белом приемнике: белое перо на белом приемнике, белое перо на черном приемнике, черное перо на белом приемнике и черное перо на черном приемнике.

Что произойдет с приемником после рисования? Один вариант — это линия всегда будет черной, независимо от цвета пера или приемника: Это режим рисования, имеющий один из ROP2 кодов, а именно код R2_BLACK. Другой вариант — это линия будет черной, кроме комбинации, когда и перо и приемник — черные. В этом случае линия будет белой. Хотя это может показаться странным, в Windows есть соответствующий режим рисования, который называется R2_NOTMERGEPEN. Windows выполняет поразрядную операцию OR над пикселями пера и приемника, а затем инвертирует результат.

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

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

SetROP2(hdc, iDrawMode);

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

iDrawMode = GetROP2(hdc);

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

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

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