Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Метода по ОАиП.doc
Скачиваний:
13
Добавлен:
11.05.2015
Размер:
3.21 Mб
Скачать

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

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

InvalidateRect(hwnd,NULL,TRUE);

Получить координаты недействительного прямоугольника можно с помощью функции GetUpdate­Rect, а сделать действительным прямоугольник в рабочей области –ValidateRect.

Получая сообщение WM_PAINT, координаты недействительного прямо­угольника доступны из полей структурыPAINTSTRUCT, заполняемой при вызове функцииBeginPaint. Этот недействительный прямоугольник также определяет регион отсечения, за пределами которого нельзя рисовать.

Для создания региона отсечения (выбрав регион в контекст устройства) используются функции

SelectObject (hdc, hRgn); SelectClipRgn (hdc, hRgn);

регион отсечения задается в координатах устройства.

Среда Windowsсодержит несколько функций для манипуляции с регионом отсечения, таких какExcludeClipRect– исключение прямо­уголь­ника из региона отсечения;IntersectClipRect– создание нового региона отсечения, который представляет собой пересечение предыдущего региона отсечения и прямоугольника;OffsetClipRgn– перемещение региона отсечения в другую часть рабочей области.

6.14. Растровая графика

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

Для большинства устройств отображения первичен растровый принцип формирования изображения. Некоторые контексты поддерживают не все функции растровой графики. Информацию о совместимости может предоставить функция GetDeviceCaps().

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

COLORREF SetPixel (hdc, nX, nY, crColor);

BOOL SetPixelV (hdc, nX, nY, crColor);

COLORREF GetPixel (hdc, nX, nY);

выполняют соответственно изменение состояния (цвета) одной логической точки и получение текущего состояния. Функция SetPixelV() приводит значение цвета к ближайшему представимому в данном контексте цвету; возвращаемое значение – состояние точки на момент вызова функции (COLORREF), либо признак успешности выполнения (BOOL). Параметры

nX,nY– логические координаты точки (int);

crColor– новое значение цвета точки (COLORREF).

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

Битовый образ(bitmap) – двухмерный массив числовых значений, характеризующий состояние точек некоторой области, обычно прямоугольной.

В простейшем случае битовый образ описывается структурой BITMAP, содержащей поля:

LONG bmType– тип образа, должен быть равен 0;

LONG bmWidth, LONGbmHeight– положительные значения ширины и высоты прямоугольной области в пикселах;

LONG bmWidthBytes– размер в байтах образа одной строки изображения, в средеWindowsдолжен быть кратен 2, т.к. система предполагает, что массив состоит из слов;

WORD bmPlanes– количество цветовых планов (плоскостей), т.е. компонент, задающих цвет;

WORD bmBitsPixel– количество бит для кодирования цвета точки;

LPVOID bmBits– указатель на двухмерный массив данных, каждая строка которого соответствует одной строке изображения.

Используются монохромный и цветной типы образов. В случае монохромного – одноцветовой план и один бит на точку, единичное значение этого бита задает для точки цвет переднего плана (foreground), нулевое – заднего (backgroung).

Битовые образы – объекты, идентифицирующиеся их описателями – HBITMAP. Различают совместимые и контекстно-незави­си­мые объектыBITMAP.

Функции

HBITMAPCreateBitmap (intnWidth,intnHeight,UINTcPlanes,

UINT cBitsPerPel, const void* lpvBits );

HBITMAP CreateBitmapIndirect (const BITMAP* lpBitmap);

создают объект BITMAPс указанными характеристиками, возвращаемое значение – описатель объекта илиNULLв случае ошибки; параметры:

nWidth,nHeight– размеры образа в точках изображения;

cPlanes – количество цветовых планов;

cBitsPerPel – «глубина» цвета;

lpvBits – массив данных образа;

lpBitmap – структураBITMAP, содержащая перечисленные параметры.

Функция

HBITMAP CreateCompatibleBitmap (hdc, int nWidth, int nHeight);

создает объект BITMAPсовместимого типа для заданного контекста с заданными размерами; в зависимости от контекста он может быть создан цветным или монохромным (если в контексте заданы данные разделаDIB– контекстно-независимым); возвращаемое значение – описатель объекта илиNULL;nWidthиnHeight – размеры образа.

Для доступа к содержимому битового образа предусмотрены функции SetDlBits() иGetDlBits(), которые работают построчно, однако имеется возможность воздействовать на него всеми доступными инструментами. Для этого объектBITMAPсвязывается с некоторым контекстом с помощью универсальной функцииSelectObject(), после чего все изменения в контексте будут отображаться и в битовом образе.

Функции:

BOOL BitBlt (HDC hDstDC, int nDstX, int nDstY, int nDstWidth,

int nDstHeight,HDC hSrcDC, int nSrcX, int nSrcY, DWORD dwRop);

BOOL StretchBlt (HDC hDstDC, int nDstX, int nDstY, int nDstWidth,

int nDstHeight, HDC hSrcDC, int nSrcX, int nSrcY, int nSrcWidth,

int nSrcHeight, DWORD dwRop);

BOOL MaskBlt (HDC hDstDC, int nDstX, int nDstY, int nDstWidth,

int nDstHeight, HDC hSrcDC, int nSrcX, int nSrcY,

HBITMAP hbmMask, int nMaskX, int nMaskY, DWORD dwRop);

BOOL PlgBlt (HDC hDstDC, const POINT* lpDstVertices, HDC hSrcDC,

int nSrcX, int nSrcY, HBITMAP hbmMask, int nMaskX, int nMaskY,

DWORDdwRop);

выполняют перенос прямоугольного фрагмента изображения из контекста-источника в контекст-приемник (с трансформацией и дополнительными операциями). Функция StretchBltможет изменять масштаб изображения фрагмента;MaskBltпозволяет маскировать часть изображения;PlgBltосуществляет перенос в непрямоугольную область приемника с соответствующим искажением; возвращаемое значение – признак успешности выполнения; параметры:

hSrcDC,hDstDC– контексты источника и приемника данных;

nSrcX,nSrcY,nDstX,nDstY– координаты фрагмента в обоих контекстах;

nSrcWidth,nSrcHeight,nDstWidth,nDstHeight– размеры фрагментов;

hbmMask – битовый образ маски, монохромного типа, нулевые точки маски указывают на применение к данной точке изображения операции «заднего плана», единичные – «переднего плана»;

nMaskX,nMaskY – точка привязки в образе маски;

lpDstVertices – массив структур, задающих вершины параллелограмма, образующего фрагмент-приемник;

dwRop– дополнительная операция, применяемая к фрагменту при переносе:SRCCOPY– простое копирование,SRCAND– комбинация цветов источника и приемника по «И»,SRCPAINT– комбинация по «ИЛИ»,SRCIN­VERT– комбинация по «исключающему ИЛИ»,SRCERASE– комбинация по «И» цвета источника и инверсии цвета приемника,NOTSRCCOPY,NOT­SRCERASE– соответствует одноименным, но результирующий цвет инвертируется,DSTINVERT– инверсия фрагмента-приемника,BLACK­NESS,WHITE­NESS– заполнение фрагмента-получателя цветом соответственно 0 и 1 физической палитры и другие. ДляMaskBltпараметр включает операции для переднего и заднего фонов, формируется с помощью макросаMAKEROP4.

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

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

Эффекты, возникающие при деформации битового образа, дополните­льно управляются функцией SetStretchBltMode, текущая настойка –GetStretchBltMode.