Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
WinAPI.docx
Скачиваний:
49
Добавлен:
16.12.2018
Размер:
3.43 Mб
Скачать

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

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

Когда вы создаете регион, Windows возвращает описатель региона, имеющий тип HRGN. Простейший тип региона — это прямоугольник. Вы можете создать прямоугольный регион одним из двух способов:

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, уничтожается. (Когда вы используете эту функцию, вы можете сначала сделать так, чтобы hDestRgn ссылался на маленький прямоугольный регион.)

Параметр iCombine описывает, как объединяются 2 региона с описателями hSrcRgn1 и hSrcrgn2:

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

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

FillRgn(hdc, hRgn, hBrush);

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

InvertRgn(hdc, hRgn);

PaintRgn(hdc, hRgn);

Функции FillRgn, FrameRgn и InvertRgn похожи на функции FillRect, FrameRect и InvertRect. Параметры xFrame и yFrame функции FrameRgn — это логические ширина и высота рамки, которая будет нарисована вокруг региона.

Функция PaintRgn закрашивает внутреннюю область региона текущей выбранной в контекст устройства кистью.

Во всех этих функциях предполагается, что регион определен в логических координатах.

Когда вы заканчиваете работу с регионом, вы можете его удалить, используя ту же самую функцию DeleteObject, что и для удаления других объектов GDI:

DeleteObject(hRgn);

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]