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

141

BitBlt(hdcMem2, 0, 0, bm.bmWidth / 2, bm.bmHeight / 2, hdcMem1, 0, 0, SRCCOPY);

Все сделано, кроме очистки:

DeleteDC(hdcMem1);

DeleteDC(hdcMem2);

DeleteObject(hBitmap);

Преобразования цветов

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

Монохромный DC (Источник)

Цветной DC (Приемник)

0

(Черный)

Цвет текста (по умолчанию черный)

1

(Белый)

Цвет фона (по умолчанию белый)

Кроме того, атрибут цвета фона используется Windows для заполнения пробелов в точечных и штриховых линиях, а также между штрихами в штриховых кистях. Вы можете изменить цвет фона с помощью функции SetBkColor. Цвет фона, с которым мы еще встретимся позднее в этой главе, определяет цвет текста. Вы можете изменить его с помощью функции SetTextColor. По умолчанию, монохромный битовый образ просто преобразуется в черно-белый битовый образ в цветном контексте устройства.

Преобразование битового образа из цветного контекста устройства в монохромный приемный контекст устройства является менее удовлетворительным:

Цветной DC (Источник)

Монохромный DC (Приемник)

Пиксель != Цвет фона

0

(Черный)

Пиксель == Цвет фона

1

(Белый)

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

Здесь существует проблема, связанная с цветами: Windows необходимо сравнить конкретную комбинацию битов цвета битового образа (лежащих в разных цветовых плоскостях или в одной плоскости) с 24-битным значением цвета фона. Это значит, что цветной контекст устройства должен относиться к физическому устройству или быть контекстом памяти на базе реального устройства. Например, у вас имеется монохромный драйвер устройства. Вы строите контекст памяти на базе дисплейного контекста устройства и выбираете цветной битовый образ в контекст памяти, а затем делаете попытку перенести битовый образ в монохромный контекст устройства. Это не удается, потому что Windows не знает, как множество цветовых плоскостей или множество битов на пиксель битового образа контекста памяти соотносится с реальными цветами.

Преобразования режимов отображения

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

BitBlt(hdcDest, xDest, yDest, xWidth, yHeight, hdcSrc, xSrc, ySrc, dwROP);

Величины xWidth и yHeight задаются в логических единицах и относятся одновременно к прямоугольникам исходного и приемного контекста устройства. Функция BitBlt должна преобразовать все координаты и размеры в координаты устройства перед вызовом драйвера для выполнения операции. Поскольку значения xWidth и yHeight используются для обоих контекстов устройства, они должны преобразовываться в единицы устройства (пиксели) независимо для каждого контекста устройства.

Когда исходный и приемный контексты устройства равны или когда оба контекста устройства используют режим отображения MM_TEXT, размер этого прямоугольника в единицах устройства будет одинаковым для обоих контекстов устройства. Windows тогда может осуществить простой перенос пиксель-в-пиксель. Однако, когда размеры прямоугольника в единицах устройства различны в двух контекстах устройства, Windows перекладывает работу на более мощную функцию StretchBlt.

Растяжение битовых образов с помощью функции StretchBlt

Функция StretchBlt имеет два дополнительных параметра по сравнению с функцией BitBlt:

142

StretchBlt(

hdcDest, xDest, yDest, xDestWidth, yDestHeight, hdcSrc, xSrc, ySrc, xSrcWidth, ySrcHeight, dwROP

);

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

Так же как функция BitBlt — есть расширение функции PatBlt, так и функция StretchBlt — есть расширение функции BitBlt, позволяющее задавать раздельно размеры исходного и приемного прямоугольника. Как и у функций PatBlt и BitBlt все координаты и значения в функции StretchBlt задаются в логических единицах. Функция StretchBlt также позволяет вам переворачивать изображение по горизонтали и вертикали. Если знаки xSrcWidth и xDestWidth (при преобразовании в единицы устройства) различны, то функция StretchBlt создает зеркальное изображение: левая часть становится правой, правая часть — левой. Если знаки ySrcHeight и yDestHeight (при преобразовании в единицы устройства) различны, то функция StretchBlt переворачивает изображение по вертикали.

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

При сжатии битового образа функция StretchBlt должна комбинировать две или более строки или столбца пикселей в одну строку или столбец. Она делает это одним из трех способов в зависимости от атрибута режима растяжения в контексте устройства. Вы можете использовать функцию SetStretchBltMode для изменения этого атрибута:

SetStretchBltMode(hdc, iMode);

Величина iMode может принимать следующие значения:

BLACKONWHITE (по умолчанию) — Если два или более пикселей должны быть преобразованы в один пиксель, то функция StretchBlt выполняет логическую операцию AND над пикселями. Результирующий пиксель будет белым только в том случае, если все исходные пиксели были белыми, что на практике означает, что черные пиксели преобладают над белыми.

WHITEONBLACK — Если два или более пикселей должны быть преобразованы в один пиксель, то функция StretchBlt выполняет логическую операцию OR над пикселями. Результирующий пиксель будет черным только в том случае, если все исходные пиксели были черными, что означает, что белые пиксели преобладают над черными.

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

Кисти и битовые образы

Когда вы используете функции CreatePatternBrush или CreateBrushIndirect с полем lbStyle, установленным в значение BS_PATTERN, вы должны сначала получить описатель битового образа. Битовый образ должен быть размером как минимум 8 на 8 пикселей. Если он больше, то Windows использует только левый верхний угол битового образа для кисти.

Поскольку кисти и битовые образы — объекты GDI, вы должны удалить все объекты, созданные вами, до того, как ваша программа завершится. Когда вы создаете кисть на базе битового образа, Windows делает копию данных битового образа для использования при рисовании кистью. Вы можете удалить битовый образ сразу же после вызова функций CreatePatternBrush или CreateBrushIndirect без какого-либо влияния на кисть. Аналогично, вы можете удалить кисть без влияния на битовый образ.

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

Рис. 4.27 Фигура, закрашенная пользовательской кистью

Битовый образ, который вам нужен, выглядит так:

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