Шаг 156 - О регионах (CRgn)

Мы все с Вами привыкли, что Windows прямоугольный. Вроде к этому ведет всё. Формы, окна все они прямоугольные. Единственный способ бороться с этим - это применять регионы. Использование регионов позволит Вам создавать окна любой формы.

Регион в Windows - это замкнутая фигура, обычно для региона применяют английское слово RGN. В MFC есть соотвествующий класс CRgn. Как всегда этот класс соответствует чему-то в Windows. В Windows же есть понятие HRGN, то есть указатель на регион.

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

int SetWindowRgn( HRGN hRgn, BOOL bRedraw ); // установить регион
int GetWindowRgn( HRGN hRgn )const;	     // получить регион

Для того, чтобы использовать регион его нужно создать, регионы могут быть разной формы и создаются они по разному.

BOOL CreateRectRgn( int x1, int y1, int x2, int y2 );	   		
// прямоугольные регион
BOOL CreateRectRgnIndirect( LPCRECT lpRect );		   	
// 	тоже самое только входящие данные структура CRect
BOOL CreateEllipticRgn( int x1, int y1, int x2, int y2 );  		
// элипсоидный регион
BOOL CreateEllipticRgnIndirect( LPCRECT lpRect );	   		
// тоже самое только входящие данные структура CRect
BOOL CreatePolygonRgn( LPPOINT lpPoints, int nCount, int nMode );	
// регион из массива точек
BOOL CreatePolyPolygonRgn( LPPOINT lpPoints, LPINT lpPolyCounts, int nCount, int nPolyFillMode );
// регион из набора регионов
BOOL CreateRoundRectRgn( int x1, int y1, int x2, int y2, int x3, int y3 );
// регион с закруглеными краями

Но на этом все не заканчивается, регионы можно комбинировать и получать более новые и сложные фигуры.

int CombineRgn( CRgn* pRgn1, CRgn* pRgn2, int nCombineMode );
// комбинирование регионов.

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

RGN_AND 		пересечение регионов 
RGN_COPY 		копия  
RGN_DIFF 		не пренадлежащая часть 
RGN_OR 			объединение двух 
RGN_XOR 		объединение без пересечений 

И теперь самое важное - это функции, которые определяеют попадание точки внуть региона. Это очень радует, так как регион может быть довольно сложной формы и круглый например. Меня данная возможность радует потому, что мне совсем не хочется код попадания в круг писать самому или в эллипс или в сложную фигуру, например, звезду.

BOOL PtInRegion( int x, int y ) const;
BOOL PtInRegion( POINT point ) const;

Для чего же можно использовать регионы ??? Ну во-первых различные формы окон и областей рисования. Именно с помощью регионов вы можете ограничивать области рисования придавая им самые немыслимые формы. Второе это определение попадания на в объект на экране. Так как регион может быть любой сложности, то есть возжность определения попадая мышью даже в очень сложные фигуры.


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 18.03.2000