Оценить:
 Рейтинг: 4.6

Программирование в Delphi. Трюки и эффекты

Год написания книги
2010
Теги
<< 1 2 3 4 5 6 7 8 9 10 ... 42 >>
На страницу:
6 из 42
Настройки чтения
Размер шрифта
Высота строк
Поля

Рис. 1.4. Округление прямоугольника функцией CreateRoundRectRgn

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

function CreatePolygonRgn(const Points; Count, FillMode: Integer): HRGN;

Функция CreatePolygonRgn использует следующие параметры:

• Points – указатель на массив записей типа TPoint, каждый элемент которого описывает одну вершину многоугольника (координаты не должны повторяться);

• Count – количество записей в массиве, на который указывает параметр Points;

• FillMode – способ заливки региона (в данном случае определяет, попадает ли внутренняя область многоугольника в регион).

Параметр FillMode принимает значения WINDING (попадает любая внутренняя область) и ALTERNATE (попадает внутренняя область, если она находится между нечетной и следующей четной сторонами многоугольника).

Примечание

При создании регионов с помощью любой из указанных выше функций координаты точек задаются в системе координат того окна, в котором предполагается использовать регион. Так, если у вас есть кнопка размером 40 х 30 пикселов, левый верхний угол которой расположен на форме в точке (100; 100), то для того, чтобы создать для кнопки прямоугольный регион 20 х 15 пикселов с левой верхней точкой (0;0) относительно начала координат кнопки, следует вызвать функцию CreateRectRgn с параметрами (0, 0, 19, 14), а не (100, 100, 119, 114).

Поскольку регион является GDI-объектом (подробнее в гл. 6), то для его удаления, если он не используется системой, применяется функция удаления GDI-объектов DeleteObject:

function DeleteObject(p1: HGDIOBJ): BOOL;

Регион как область отсечения при рисовании окна

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

function SetWindowRgn(hWnd: HWND; hRgn: HRGN; bRedraw: BOOL): Integer;

Функция возвращает 0, если произвести операцию не удалось, и ненулевое значение в случае успешного выполнения операции. Параметры функции SetWindowRgn следующие:

• hWnd – дескриптор окна, для которого устанавливается область отсечения (свойство Handle формы или элемента управления);

• hRgn – дескриптор региона, назначаемого в качестве области отсечения (в простейшем случае является значением, возвращенным одной из функций создания региона);

• bRedraw – флаг перерисовки окна после назначения новой области отсечения (для видимых окон обычно используется значение True, для невидимых – False).

Чтобы получить копию региона, формирующего область отсечения окна, можно использовать API-функцию GetWindowRgn:

function GetWindowRgn(hWnd: HWND; hRgn: HRGN): Integer;

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

• NULLREGION – пустой регион;

• SIMPLEREGION – регион в форме прямоугольника;

• COMPLEXREGION – регион сложнее, чем прямоугольник;

• ERROR – при выполнении функции возникла ошибка либо окну задана область отсечения.

Далее приведен пример использования функции GetWindowRgn (предполагается, что приведенный ниже код является телом одного из методов класса формы).

var rgn: HRGN;

begin

rgn:= CreateRectRgn(0,0,0,0); //Первоначальная форма региона не важна

if GetWindowRgn(Handle, rgn) <> ERROR then

begin

//Операции с копией региона, формирующего область отсечения окна...

end;

DeleteObject(rgn); //Мы пользовались копией региона, которую должны

//удалить (здесь или в ином месте, но сами)

end;

Операции над регионами

При рассказе о функциях создания регионов неоднократно упоминалось о возможности комбинирования регионов для получения сложных форм. Пришло время кратко рассмотреть операции над регионами. Все операции по комбинированию регионов осуществляются с помощью функции CombineRgn:

function CombineRgn(p1, p2, p3: HRGN; p4: Integer): Integer;

Параметры этой функции следующие:

• p1 – регион (предварительно созданный), предназначенный для сохранения результата;

• p2, p3 – регионы-аргументы операции;

• p4 – тип операции над регионами.

Более подробно действие функции CombineRgn при различных значениях параметра p4 поясняется в табл. 1.2.

Таблица 1.2. Операции функции CombineRgn

Кроме приведенных в табл. 1.2 констант, в качестве параметра p4 функции CombineRgn можно использовать параметр RGN_COPY. При его использовании копируется регион, заданный параметром p2, в регион, заданный параметром p1.

Тщательно рассчитывая координаты точек регионов-аргументов, можно с использованием функции CombineRgn создавать регионы самых причудливых форм, в чем вы сможете убедиться ниже.

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

Закругленные окна и многоугольники
<< 1 2 3 4 5 6 7 8 9 10 ... 42 >>
На страницу:
6 из 42

Другие электронные книги автора Александр Анатольевич Чиртик