Урок 34 Создание нестандартного интерфйса. Регионы. February 23, 2007

February 23, 2007
в колонках играет Rainbow - Mistreated


 

Этот урок будет посвящен регионам.

Они предназначены для создания нестандартных форм непрямоугольной формы - круглых, овальных, многоугольных, звездчатых.

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

 

В WinAPI имеются функции для задания подмножества точек окна, путем определения координат и размеров геометрической фигуры (эллипса, многоугольника и т.п.), внутри которой эти точки расположены. Подмножество точек окна, которое эти функции умеют определять, называется регионом окна, а сами функции - функциями региона.

Имена функций региона соответствуют геометрической форме создаваемого региона: CreateEllipticRgn() - эллипс, CreateRectRgn() - прямоугольник, CreateRoundRectRgn() - прямоугольник со скругленными углами, CreatePolygonRgn() - произвольный многоугольник. Функции создают регион (т.е. описывающую его структуру в памяти) и возвращают дескриптор созданного региона (region handle).

 

Функция создания прямоугольного региона:

 

HRGN CreateRectRgn(

int nLeftRect,// X-координата верхнего левого угла прямоугольника

int nTopRect, // Y-координата верхнего левого угла прямоугольника

int nRightRect, // X-координата нижнего правого угла прямоугольника

int nBottomRect // Y-координата нижнего правого угла прямоугольника

)

 

 

Для описания прямоугольника достаточно указать координаты его левой верхней и правой нижней вершин. Функция создания эллиптического региона:

 

HRGN CreateEllipticRgn(

int nLeftRect,

int nTopRect,

int nRightRect,

int nBottomRect

);

 

 

Здесь задаются координаты прямоугольника, в который вписывается требуемый эллипс. Функция создания региона - произвольного многоугольника:

 

HRGN CreatePolygonRgn(

CONST POINT *lppt, // указатель на массив координат вершин

int cPoints, // число элементов массива вершин

int fnPolyFillMode // режим заполнения многоугольника

);

 

 

Прежде чем вызывать эту функцию, нужно создать и заполнить массив координат вершин многоугольника. Элементы этого массива - структуры типа POINT:

 

typedef struct tagPOINT {

LONG X,

LONG Y,

} POINT;

 

Указатель на такой массив передается в функцию первым параметром. Вторым параметром передается число вершин многоугольника. Третий параметр особого значения не имеет; может, например, всегда задаваться константой WINDING. Функция создания региона - прямоугольника со скругленными углами:

 

HRGN CreateRoundRectRgn(

int nLeftRect, // координаты прямоугольника

int nTopRect,// ...

int nRightRect,// ...

int nBottomRect, // ...

int nWidthEllipse, // ширина скругляющего эллипса

int nHeightEllipse // высота скругляющего эллипса

);

 

 

Здесь, кроме координат прямоугольника, нужно задать размеры осей эллипса, который будет применяться для закругления углов. Функция комбинирования регионов:

 

int CombineRgn(

HRGN hrgnDest, // дескриптор результирующего региона

HRGN hrgnSrc1, // дескриптор первого региона-операнда

HRGN hrgnSrc2, // дескриптор второго региона-операнда

int fnCombineMode // комбинирующая операция

);

 

 

Эта функция создает регион путем выполнения указанной теоретико-множественной операции над множествами точек двух регионов-операндов. Переменная hrgnDest, в которую будет помещен дескриптор нового региона, должна быть описана в программе заранее. Возможны следующие операции (задаваемые соответствующими константами):

RGN_AND:    пересечение двух регионов

RGN_COPY:   копия региона, заданного переменной hrgnSrc1

RGN_DIFF:   разность двух регионов

RGN_OR: объединение двух регионов

RGN_XOR:    симметрическая разность двух регионов

Функция возвращает код результата, который представляет собой одну из следующих констант:

NULLREGION: результирующий регион пуст

SIMPLEREGION:   результирующий регион есть прямоугольник

COMPLEXREGION:  результирующий регион есть сложная фигура

ERROR:      результирующий регион не был создан

 

Функция задания региона окна:

 

int SetWindowRgn(

HWND hWnd, // дескриптор окна

HRGN hRgn, // дескриптор региона

BOOL bRedraw // флаг перерисовки

);

 

 

Функция устанавливает для окна, заданного первым параметром, регион, заданный вторым параметром. Логический параметр bRedraw указывает, должно ли окно быть перерисовано немедленно в очертаниях нового региона.

 

Этих шести функций достаточно для создания сложных регионов и вывода на на экран окон с соответствующими силуэтами. Из функций управления внешним видом региона можно выделить следующие две. Функция закраски региона:

 

BOOL FillRgn(

HDC hdc, // дескриптор контекста устройства

HRGN hrgn, // дескриптор региона

HBRUSH hbr // дескриптор кисти

);

 

 

Функция закрашивает заданный регион, пользуясь параметрами заданной "кисти" (объекта brush). Если все получилось - функция возвращает True, иначе - False. Функция обрамления региона:

 

BOOL FrameRgn(

HDC hdc,// дескриптор контекста устройства

HRGN hrgn,// дескриптор региона

HBRUSH hbr, // дескриптор кисти

int nWidth, // ширина обрамления

int nHeight // высота обрамления

);

Функция окаймляет регион "бордюром" заданной ширины и высоты, в соответствии с параметрами кисти.

 

Если вы дошли до этой строчки, значит мой труд не напрасен. Фууууу....

 


Author of article - [ArtuR] 2007
www.builderhelper.3dn.ru
builder.helper@rambler.ru