Комбинирование областей
Функция CombineRegion позволяет вам изменить существующую область, скомбинировав ее из двух других:
int WINAPI CombineRgn( HRGN hrgnDest, // новая область HRGN hrgnSrc1, // первая исходная область HRGN hrgnSrc2, // вторая исходная область int fnCombineMode); // режим комбинирования
Перед вызовом функции вам надо определить все три области. Функция объединит области hrgnSrc1 и hrgnSrc2, изменив соответствующим образом область hrgnDest.
Способ комбинирования областей зависит от значения параметра fnCombineMode:
Значение параметра fnCombineMode | Способ образования области hrgnDest |
RGN_AND | Пересечение областей hrgnSrc1 и hrgnSrc2 |
RGN_OR | Объединение областей hrgnSrc1 и hrgnSrc2 |
RGN_XOR | Объединение областей hrgnSrc1 и hrgnSrc2 с исключением перекрывающихся областей |
RGN_DIFF | Область hrgnSrc1, которая не входит в область hrgnSrc2 |
RGN_COPY | Область hrgnSrc1 |
В зависимости от результата выполнения операции функция CombineRegion может вернуть одно из следующих значений:
Значение | Описание |
ERROR | Ошибка |
NULLREGION | Новая область пустая |
SIMPLEREGION | Новая область не является самопересекающейся (т. е. граница созданной области не пересекает саму себя) |
COMPLEXREGION | Создана самопересекающаяся область |
Для облегчения комбинирования областей в файле windowsx.h определены макрокоманды, предназначенные для копирования, пересечения, объединения и вычитания областей. Все они созданы на базе только что описанной функции CombineRegion :
#define CopyRgn (hrgnDst, hrgnSrc) \ CombineRgn(hrgnDst, hrgnSrc, 0, RGN_COPY)
#define IntersectRgn (hrgnResult, hrgnA, hrgnB) \ CombineRgn(hrgnResult, hrgnA, hrgnB, RGN_AND)
#define SubtractRgn (hrgnResult, hrgnA, hrgnB) \ CombineRgn(hrgnResult, hrgnA, hrgnB, RGN_DIFF)
#define UnionRgn (hrgnResult, hrgnA, hrgnB) \ CombineRgn(hrgnResult, hrgnA, hrgnB, RGN_OR)
#define XorRgn (hrgnResult, hrgnA, hrgnB) \ CombineRgn(hrgnResult, hrgnA, hrgnB, RGN_XOR)