1 ...5 6 7 9 10 11 ...121 end;
В листинге 1.14 приведена процедура создания шестиугольника.
...
Листинг 1.14.
Создание шестиугольника
procedure Make6Angle(width, height: Integer; var points: array
of TPoint);
begin
points[0].X:= 0;
points[0].Y:= height div 2;
points[1].X:= width div 3;
points[1].Y:= 0;
points[2].X:= 2 * (width div 3);
points[2].Y:= 0;
points[3].X:= width – 1;
points[3].Y:= height div 2;
points[4].X:= 2 * (width div 3);
points[4].Y:= height – 1;
points[5].X:= width div 3;
points[5].Y:= height – 1;
end;
Листинг 1.15 содержит процедуру создания пятиугольника (неправильного).
...
Листинг 1.15.
Создание пятиугольника
procedure Make5Angle(width, height: Integer; var points: array
of TPoint);
var a: Integer; //Сторона пятиугольника
begin
a:= width div 2;
points[0].X:= a;
points[0].Y:= 0;
points[1].X:= width – 1;
points[1].Y:= a div 2;
points[2].X:= 3 * (a div 2);
points[2].Y:= height – 1;
points[3].X:= a div 2;
points[3].Y:= height – 1;
points[4].X:= 0;
points[4].Y:= a div 2;
end;
Пятиугольная звезда, используемая как область отсечения формы, создается при помощи приведенной в листинге 1.15 процедуры Make5Angle. После изменяется порядок следования вершин пятиугольника, чтобы их обход при построении региона выполнялся так, как рисуется звезда карандашом на бумаге (например, 1-3-5-2-4) (листинг 1.16).
...
Листинг 1.16.
Создание пятиугольной звезды
procedure MakeStar(width, height: Integer; var points: array
of TPoint);
begin
Make5Angle(width, height, points);
//При построении звезды точки пятиугольника обводятся не по
//порядку,а через одну
Swap(points[1], points[2]);
Swap(points[2], points[4]);
Swap(points[3], points[4]);
end;
Процедура MakeStart (листинг 1.16) использует дополнительную процедуру Swap, меняющую местами значения двух передаваемых в нее аргументов. Процедура Swap реализуется чрезвычайно просто и потому в тексте книги не приводится.
Комбинированные регионы
Вы уже научились создавать и использовать простые регионы. Однако многим может показаться недостаточным тех форм окон, которые получаются с использованием лишь одного несложного региона в качестве области отсечения. Пришло время заняться созданием окон более сложной формы, применяя рассмотренные ранее операции над регионами.
«Дырявая» форма
Этот простейший пример сомнительной полезности предназначен для знакомства с операциями над регионами. Здесь применяется только одна из возможных операций – операция XOR для формирования «дырок» в форме (рис. 1.8).
Рис. 1.8. «Дырки» в форме
На рис. 1.8 явно видно, как в «дырках» просвечивается одно из окон среды разработки Delphi. При этом сообщения от мыши, когда указатель находится над «дыркой», получает не наше окно, а те, часть которых видна в «дырке». Программный код, приводящий к созданию формы столь необычного вида, приведен в листинге 1.17.
...
Листинг 1.17.
Создание «дырок» в форме
procedure TfrmHole.FormCreate(Sender: TObject);
var
rgn1, rgn2: HRGN; //"Регионы-дырки" в форме
formRgn: HRGN;
begin
//Создание региона для формы
formRgn := CreateRectRgn(0, 0, Width – 1, Height – 1);
//Создание регионов для «дырок»
rgn1 := CreateEllipticRgn(10, 10, 100, 50);
rgn2 := CreateRoundRectRgn(10, 60, 200, 90, 10, 10);
//Создание «дырок» в регионе формы
CombineRgn(formRgn, formRgn, rgn1, RGN_XOR);
CombineRgn(formRgn, formRgn, rgn2, RGN_XOR);
SetWindowRgn(Handle, formRgn, True);
//Регионы для «дырок» больше не нужны
DeleteObject(rgn1);
DeleteObject(rgn2);
end;
Сложная комбинация регионов
Теперь пришла очередь более сложного, но и гораздо более интересного примера. Последовательное применение нескольких операций над регионами приводит к созданию формы, показанной на рис. 1.9 (белое пространство – это вырезанные части формы).
Рис. 1.9. Сложная комбинация регионов
Процедура, в которой производятся операции над регионами, приведена в листинге 1.18.
...
Листинг 1.18.
Сложная комбинация регионов
procedure TfrmManyRgn.FormCreate(Sender: TObject);
var
r1, r2, r3, r4, r5, r6, r7: HRGN;
formRgn: HRGN;
butRgn: HRGN;
begin
//Создание регионов
r1 := CreateRoundRectRgn(100, 0, 700, 400, 40, 40);
r2 := CreateRectRgn(280, 0, 300, 399);
r3 := CreateRectRgn(500, 0, 520, 399);
r4 := CreateEllipticRgn(140, 40, 240, 140);
r5 := CreateEllipticRgn(0, 300, 200, 500);
r6 := CreateEllipticRgn(500, 40, 600, 140);
r7 := CreateEllipticRgn(540, 40, 640, 140);
Читать дальше
Конец ознакомительного отрывка
Купить книгу