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

Создание и рисование регионов

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

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

ExtCreateRegion (const XFORM *lpXform, DWORD nDataSize,

constRGNDATAlpRgnData);

структура XFORMописывает преобразование региона в экранные координаты, при его равенствеNULLкоординаты считаются идентичными; регион описывается структуройRGNDATA, содержащей поля:

RGNDATAHEADERrdh – структура данных заголовка;

charBuffer[1] – буфер структурRECT, образующих регион.

В свою очередь, структура RGNDATAHEADERсодержит поля:

DWORDdwSize– размер заголовка в байтах;

DWORD iType – тип региона (RGN_RECTANGLES);

DWORDnCount– количество прямоугольников в буфере;

DWORDnRgnSize– требуемый размер буфера (может быть нулевым);

RECTrcBound– вмещающий прямоугольник для региона.

Простейший тип региона – прямоугольник может быть создан с помощью функций

hRgn = CreateRectRgn (xLeft, yTop, xRight, yBottom);

hRgn=CreateRectRgnIndirect(&rect);

Для создания эллиптических регионов:

hRgn = CreateEllipticRgn (xLeft, yTop, xRight, yBottom);

hRgn = CreateEllipticRgnIndirect (&rect);

Функция CreateRoundRectRgn строит прямоугольный регион со скругленными углами.

Создание многоугольного региона (похоже на функцию Polygon):

hRgn = CreatePolygonRgn (&point, iCount, iPolyFillMode);

параметр point – массив структур типа POINT, iCount – число точек, iPolyFillModeALTERNATE (WINDING). Регион из множества многоугольников –CreatePolyPolygonRgn.

Два региона могут быть объединены в один функцией:

iRgnType = CombineRgn (hDestRgn, hSrcRgn1, hSrcRgn2, iCombine);

которая комбинирует два исходных региона (hSrcRgn1иhSrcRgn2) и строит третий, на который ссылаетсяhDestRgn. Все три описателя регионов еще до вызова функции должны быть действительными, однако дополнительный регион, описываемый ранееhDestRgn, уничтожается.

Параметр iCombine задает правило объединения регионов:

RGN_AND – область пересечения двух исходных регионов;

RGN_OR – объединение двух исходных регионов;

RGN_XOR – объединение двух исходных регионов за исключением области пересечения;

RGN_DIFF – часть региона hSrcRgn1, не входящая в регионhSrcRg2;

RGN_COPY– регионhSrcRgn1.

Значение iRgnType, возвращаемое функцией, означает:NULLREGION– регион пуст;SIMPLEREGION– регион представляет собой простой прямо­уго­льник, эллипс или многоугольник;COMPLEXREGION– комбинация прямоугольников, эллипсов или многоугольников;ERROR– произошла ошибка.

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

FillRgn (hdc,hRgn,hBrush); FrameRgn (hdc,hRgn,hBrush,xFrame,yFrame);

InvertRgn (hdc, hRgn); PaintRgn (hdc, hRgn);

аналогичных функциям FillRect(закрашивание прямоугольной области),FrameRect(закрашивание границы прямоугольной области) иInvertRect(инвертирование пикселей в прямоугольнике); параметрыxFrame иyFrame– ширина и высота рамки, которая будет нарисована вокруг региона.

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

Для удаления региона используется функция удаления объектов GDI:

DeleteObject(hRgn);

Функция GetRgnDataпозволяет получить доступ к данным региона по его описателю. Вмещающий прямоугольник для региона может быть получен функциейGetRgnBox.

Функции PtInRegionиRectInRegionпроверяют соответственно точку и прямоугольник на вхождение их в регион.

Регион может быть обведен или закрашен с использованием текущих инструментов данного контекста.