Унифицированным средством, задающим границу области вывода, является регион, который может иметь прямоугольную, многоугольную, эллиптическую формы или их сочетание. Регион является объектом, идентифицируемым его описателем HRGN.
Произвольный регион создается универсальной функцией:
структура XFORM описывает преобразование региона в экранные координаты, при его равенстве NULL координаты считаются идентичными; регион описывается структурой RGNDATA, содержащей поля:
RGNDATAHEADER rdh – структура данных заголовка;
char Buffer[1] – буфер структур RECT, образующих регион.
В свою очередь, структура RGNDATAHEADER содержит поля:
DWORD dwSize – размер заголовка в байтах;
DWORD iType – тип региона (RGN_RECTANGLES);
DWORD nCount – количество прямоугольников в буфере;
DWORD nRgnSize – требуемый размер буфера (может быть нулевым);
RECT rcBound – вмещающий прямоугольник для региона.
Простейший тип региона – прямоугольник может быть создан с помощью функций
параметр point – массив структур типа POINT, iCount – число точек, iPolyFillMode – ALTERNATE (WINDING). Регион из множества многоугольников – CreatePolyPolygonRgn.
Два региона могут быть объединены в один функцией:
которая комбинирует два исходных региона (hSrcRgn1 и hSrcRgn2) и строит третий, на который ссылается hDestRgn. Все три описателя регионов еще до вызова функции должны быть действительными, однако дополнительный регион, описываемый ранее hDestRgn, уничтожается.
Параметр iCombine задает правило объединения регионов:
RGN_AND – область пересечения двух исходных регионов;
RGN_OR – объединение двух исходных регионов;
RGN_XOR – объединение двух исходных регионов за исключением области пересечения;
RGN_DIFF – часть региона hSrcRgn1, не входящая в регион hSrcRg2;
RGN_COPY– регион hSrcRgn1.
Значение iRgnType, возвращаемое функцией, означает: NULLREGION – регион пуст; SIMPLEREGION – регион представляет собой простой прямоугольник, эллипс или многоугольник; COMPLEXREGION – комбинация прямоугольников, эллипсов или многоугольников; ERROR – произошла ошибка.
Полученный описатель региона можно использовать в функциях
аналогичных функциям FillRect (закрашивание прямоугольной области), FrameRect (закрашивание границы прямоугольной области) и InvertRect (инвертирование пикселей в прямоугольнике); параметры xFrame и yFrame – ширина и высота рамки, которая будет нарисована вокруг региона.
Функция PaintRgn закрашивает внутреннюю область региона текущей выбранной в контекст устройства кистью. Во всех функциях предполагается, что регион определен в логических координатах.
Для удаления региона используется функция удаления объектов GDI:
DeleteObject (hRgn);
Функция GetRgnData позволяет получить доступ к данным региона по его описателю. Вмещающий прямоугольник для региона может быть получен функцией GetRgnBox.
Функции PtInRegion и RectInRegion проверяют соответственно точку и прямоугольник на вхождение их в регион.
Регион может быть обведен или закрашен с использованием текущих инструментов данного контекста.