Прямоугольники и регионы отсечения
Прямоугольники и регионы могут принимать участие в отсечении. ФункцияInvalidateRect делает недействительным прямоугольную область дисплея и генерирует сообщение WM_PAINT. Ее можно использовать, например, для обновления рабочей области:
InvalidateRect (hwnd, NULL, TRUE);
Получить координаты недействительного прямоугольника можно с помощью функции GetUpdateRect, а сделать действительным прямоугольник в рабочей области – ValidateRect.
Получая сообщение WM_PAINT, координаты недействительного прямоугольника доступны из полей структуры PAINTSTRUCT, заполняемой при вызове функции BeginPaint. Этот недействительный прямоугольник также определяет регион отсечения, за пределами которого нельзя рисовать.
Для создания региона отсечения (выбрав регион в контекст устройства) используются функции
SelectObject (hdc, hRgn); SelectClipRgn (hdc, hRgn);
регион отсечения задается в координатах устройства.
Среда Windows содержит несколько функций для манипуляции с регионом отсечения, таких как ExcludeClipRect – исключение прямоугольника из региона отсечения; IntersectClipRect – создание нового региона отсечения, который представляет собой пересечение предыдущего региона отсечения и прямоугольника; OffsetClipRgn – перемещение региона отсечения в другую часть рабочей области.
Растровая графика
Все рассмотренные выше функции базировались на вычерчивании графических примитивов определенными инструментами по заданным командам, т.е. по векторному принципу. Растровая графика предусматривает доступ к изображению на уровне образующих его точек.
Для большинства устройств отображения первичен растровый принцип формирования изображения. Некоторые контексты поддерживают не все функции растровой графики. Информацию о совместимости может предоставить функция 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, LONG bmHeight – положительные значения ширины и высоты прямоугольной области в пикселах;
LONG bmWidthBytes – размер в байтах образа одной строки изображения, в среде Windows должен быть кратен 2, т.к. система предполагает, что массив состоит из слов;
WORD bmPlanes – количество цветовых планов (плоскостей), т.е. компонент, задающих цвет;
WORD bmBitsPixel – количество бит для кодирования цвета точки;
LPVOID bmBits – указатель на двухмерный массив данных, каждая строка которого соответствует одной строке изображения.
Используются монохромный и цветной типы образов. В случае монохромного – одноцветовой план и один бит на точку, единичное значение этого бита задает для точки цвет переднего плана (foreground), нулевое – заднего (backgroung).
Битовые образы – объекты, идентифицирующиеся их описателями – HBITMAP. Различают совместимые и контекстно-независимые объекты BITMAP.
Функции
HBITMAP CreateBitmap ( int nWidth, int nHeight, UINT cPlanes,
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,
DWORD dwRop);
выполняют перенос прямоугольного фрагмента изображения из контекста-источника в контекст-приемник (с трансформацией и дополнительными операциями). Функция StretchBlt может изменять масштаб изображения фрагмента; MaskBlt позволяет маскировать часть изображения; PlgBlt осуществляет перенос в непрямоугольную область приемника с соответствующим искажением; возвращаемое значение – признак успешности выполнения; параметры:
hSrcDC, hDstDC – контексты источника и приемника данных;
nSrcX, nSrcY, nDstX, nDstY – координаты фрагмента в обоих контекстах;
nSrcWidth, nSrcHeight, nDstWidth, nDstHeight – размеры фрагментов;
hbmMask – битовый образ маски, монохромного типа, нулевые точки маски указывают на применение к данной точке изображения операции «заднего плана», единичные – «переднего плана»;
nMaskX, nMaskY – точка привязки в образе маски;
lpDstVertices – массив структур, задающих вершины параллелограмма, образующего фрагмент-приемник;
dwRop – дополнительная операция, применяемая к фрагменту при переносе: SRCCOPY – простое копирование, SRCAND – комбинация цветов источника и приемника по «И», SRCPAINT – комбинация по «ИЛИ», SRCINVERT – комбинация по «исключающему ИЛИ», SRCERASE – комбинация по «И» цвета источника и инверсии цвета приемника, NOTSRCCOPY, NOTSRCERASE – соответствует одноименным, но результирующий цвет инвертируется, DSTINVERT – инверсия фрагмента-приемника, BLACKNESS, WHITENESS – заполнение фрагмента-получателя цветом соответственно 0 и 1 физической палитры и другие. Для MaskBlt параметр включает операции для переднего и заднего фонов, формируется с помощью макроса MAKEROP4.
Для успешного применения этих функций требуется, чтобы оба контекста относились к одному устройству или идентичным устройствам.
При использовании функций следует учитывать, что в логических координатных системах, связанных с обоими контекстами, отсчитываются только координаты опорных точек и размеры границ фрагмента, содержимое же его всегда ориентировано одинаково.
Эффекты, возникающие при деформации битового образа, дополнительно управляются функцией SetStretchBltMode, текущая настойка –GetStretchBltMode.
* Здесь и далее по тексту объектами будем называть элементы, участвующие в программе.
* Более подробное описание функции main рассматривается в п. 11.7.
Дата добавления: 2016-01-09; просмотров: 608;