Унифицированным средством, задающим границу области вывода, является регион, который может иметь прямоугольную, многоугольную, эллиптическую формы или их сочетание. Регион является объектом, идентифицируемым его описателем 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 – число точек, iPolyFillMode – ALTERNATE (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 проверяют соответственно точку и прямоугольник на вхождение их в регион.
Регион может быть обведен или закрашен с использованием текущих инструментов данного контекста.