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

4.10.5 Запись пикселей на устройство отображения

Компьютерная графика включает в себя процедуру записи пикселей на устройство отображения. Ранее мы уже рассматривали некоторые пути выполнения этой задачи, но для больших и сложных манипуляций с пикселями в Windows есть только функции BitBlt, PatBlt и StretchBlt. BitBlt означает перенос блоков битов (bit block transfer).

Функция BitBlt переносит пиксели, другими словами, это — универсальная растровая функция (raster blaster). Термин "transfer" не совсем справедлив по отношению к функции BitBlt. Она делает больше, чем просто перенос пикселей, — она осуществляет одну из 256 логических растровых операций над тремя наборами пикселей.

Функция PatBlt

PatBlt (pattern block transfer) — это простейшая из трех blt-функций. Она существенно отличается от функций BitBlt и StretchBlt тем, что использует только один контекст устройства. Но для начала функция PatBlt подходит вполне.

Раньше мы уже встречались с атрибутом контекста устройства, называемым режимом рисования. Этот атрибут может быть установлен в одно из 16 значений, соответствующих бинарной растровой операции (ROP2). Когда вы рисуете линию, режим рисования определяет тип логической операции, которую Windows реализует над пикселями пера и пикселями приемного контекста устройства. Функция PatBlt похожа на функции рисования линий с тем исключением, что она изменяет содержимое прямоугольной области приемного контекста устройства, а не только линии. Она выполняет логическую операцию с пикселями в этом прямоугольнике и в шаблоне (pattern). Шаблон — это просто другое название кисти (brush). Поэтому функция PatBlt использует кисть, выбранную в данный момент в контексте устройства.

Синтаксис вызова функции PatBlt таков:

PatBlt(hdc, xDest, yDest, xWidth, yHeight, dwROP);

Параметры xDest, yDest, xWidth, yHeight задаются в логических координатах. Логическая точка (xDest, yDest) задает левый верхний угол прямоугольника. Он имеет ширину xWidth и высоту yHeight единиц. Это и есть та прямоугольная область, которую изменяет функция PatBlt. Логическая операция, которую выполняет функция PatBlt над кистью и приемным контекстом устройства, определяется параметром dwROP, представляющим собой двойное слово (32-битное целое) ROP кода. Этот код не имеет отношения ни к одному из кодов ROP2, используемых в режиме рисования.

В Windows существует 256 ROP кодов. Они определяют всевозможные логические комбинации исходной (source) области отображения, приемной (destination) области отображения и шаблона (или кисти). Драйвер устройства для видеомонитора поддерживает все 256 растровых операций, посредством использования "компилятора" (compiler) типов. Этот компилятор использует 32-разрядный ROP код для генерации последовательности машинных инструкций, реализующих эту логическую операцию над пикселями дисплея, а затем выполняет эти инструкции.

Старшее слово 32-разрядного ROP кода — число от 0 до 255. Младшее слово — число, которое помогает компилятору драйвера устройства в генерации машинных кодов для этой логической операции. Пятнадцать из этих 256 кодов имеют имена.

Поскольку функция PatBlt использует только приемный контекст устройства и шаблон (и не использует исходный контекст устройства), она может реализовать только подмножество этих 256 ROP кодов — 16 ROP кодов, использующих только приемный контекст устройства и шаблон. Поддерживаемые функцией PatBlt растровые операции приведены ниже в таблице. Обратите внимание, что эта таблица очень похожа на таблицу ROP2 кодов.

Для монохромного контекста устройства бит равный 1 соответствует белому пикселю, а бит равный 0 — черному пикселю. Целиком черный или целиком белый приемник и шаблон — наиболее простой пример для начала рассмотрения работы функции PatBlt. Например, если вы вызываете:

PatBlt(hdc, xDest, yDest, xWidth, yHeight, 0x5F00E9L);

то прямоугольная область с вершиной в логической точке (xDest, yDest) и имеющая ширину xWidth пикселей и высоту yHeight пикселей, будет закрашена черным цветом, только если приемник был белым и в контекст устройства была выбрана кисть WHITE_BRUSH. В противном случае приемник будет закрашен белым. Конечно, даже в монохромном контексте устройства приемник и кисть могут быть полутоновыми комбинациями черных и белых пикселей. В этом случае Windows выполняет логическую операцию по принципу "pixel by pixel", что может привести к некоторым странным результатам. Например, если приемник был закрашен кистью GRAY_BRUSH, и она является текущей выбранной в контексте устройства, то:

PatBlt(hdc, xDest, yDest, xWidth, yHeight, PATINVERT);

установит приемник в чисто белый или в чисто черный цвет, в зависимости от того, как пиксели приемника совпадут с пикселями полутоновой кисти.

Цвет добавляет больше сложностей. Windows осуществляет отдельную логическую операцию для каждой цветовой плоскости или для каждого набора битов цвета, в зависимости от того, как организована память устройства.

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

PatBlt(hdc, xDest, yDest, xWidth, yHeight, BLACKNESS);

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

PatBlt(hdc, xDest, yDest, xWidth, yHeight, WHITENESS);

Функция:

PatBlt(hdc, xDest, yDest, xWidth, yHeight, DSTINVERT);

всегда инвертирует цвет прямоугольника. Если кисть WHITE_BRUSH выбрана в контексте устройства, то функция:

PatBlt(hdc, xDest, yDest, xWidth, yHeight, PATINVERT);

также инвертирует прямоугольник.

Вспомните функцию FillRect, закрашивающую кистью прямоугольную область:

FillRect(hdc, &rect, hBrush);

Следующий код является эквивалентным функции FillRect:

hBrush = SelectObject(hdc, hBrush);

PatBlt(hdc, rect,left, rect.top,

rect.right — rect.left,

rect.bottom — rect.top, PATCOPY);

SelectObject(hdc, hBrush);

Фактически, это код, используемый Windows для реализации функции FillRect. Когда вы вызываете функцию:

InvertRect(hdc, &rect);

Windows транслирует ее в функцию:

PatBlt(hdc, rect,left, rect.top,

rect.right — rect.left,

rect.bottom — rect.top, DSTINVERT);

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