С каждым положением переключателя связываются два региона. Сенсорный регион предназначен для приема щелчков мыши, переводящих переключатель в данное положение. Также потребуется регион, который используется в качестве области отсечения при рисовании переключателя, чтобы фон картинки с переключателями не закрывал фонового изображения окна. На рис. 20.2 показаны примеры формы регионов и их размещения для одного из положений переключателя.
Рис. 20.2. Моделирование переключателя Работа с окнами произвольной формы
При наложении переключателя на фоновый рисунок окна должна отображаться только та часть, которая попадает в регион отсечения. Для этого регион переключателя можно перед рисованием занести в контекст при помощи функции SelectCl ipRgnO. Другие способы решения этой задачи, например копирование переключателя с цветовым ключом при помощи функции TransparentBlt( ), использовались в проектах, демонстрирующих движение спрайта.
Ниже будет рассмотрена программа создания нестандартных окон, но сейчас за основу следует взять окно стиля OWERLAPPED. Необходимость скрывать под фоновым изображением заголовок и рамку, а также учет различия координат точек в системе рабочей области и в системе окна делает такую программу более громоздкой, но позволяет применить функции комбинирования регионов, а также лучше осознать процессы взаимодействия операционной системы и приложения.
Операционная система позволяет приложениям создавать области довольно сложной формы путем комбинирования прямоугольных, многоугольных и эллиптических областей. Так, прямоугольник со скругленными углами создается при помощи вызова функции CreateRoundRectRgn( int nLeft.int nTop, int nRightRect. int nBottom, int nWidth, int nHeight). Она работает так же, как функция создания прямоугольного региона. Параметры nWidth и nHeight дополнительно задают размеры полуосей эллипса, дуга которого скругляет углы. Если необходимо создать многоугольник, то следует применить похожую функцию CreatePolygonRgnCPOINT *lppt. int cPoints. int fnPolyFi 11 Mode). В параметре lppt передается адрес массива вершин, в параметре cPoints указывается количество вершин. Для многоугольников с самопересечением ребер параметр fnPolyFi 11 Mode при помощи констант WINDING и ALTERNATE указывает способ определения внутренних точек региона.