Урок 34 Создание нестандартного интерфйса. Регионы.
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