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


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

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

ExtCreateRegion (const XFORM *lpXform, DWORD nDataSize,

const RGNDATA lpRgnData);

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

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

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

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

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

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

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

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

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

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

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 проверяют соответственно точку и прямоугольник на вхождение их в регион.

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

 



Дата добавления: 2017-10-04; просмотров: 889;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.008 сек.