Программирование в Delphi. Трюки и эффекты. Александр Чиртик

Чтение книги онлайн.

Читать онлайн книгу Программирование в Delphi. Трюки и эффекты - Александр Чиртик страница 8

Программирование в Delphi. Трюки и эффекты - Александр Чиртик

Скачать книгу

небольшие значения.

      Результат выполнения кода листинга 1.11 можно увидеть на рис. 1.6.

      Рис. 1.6. Окно и кнопки с округленными краями

      Теперь самый интересный из предусмотренных примеров – создание окна и кнопок в форме многоугольников, а именно: окна в форме звезды, кнопок в форме треугольника, пяти– и шестиугольника (рис. 1.7).

      Рис. 1.7. Окно и кнопки в форме многоугольников

      Код создания регионов для областей отсечения данного примера приведен в листинге 1.12.

Листинг 1.12. Окно и кнопки в форме многоугольников

      procedure TfrmPoly.FormCreate(Sender: TObject);

      var

      points: array [0..5] of TPoint;

      formRgn, but1Rgn, but2Rgn, but3Rgn: HRGN;

      begin

      //Создаем регионы для окна и кнопок

      //..шестиугольная кнопка

      Make6Angle(Button1.Width, Button1.Height, points);

      but1Rgn:= CreatePolygonRgn(points, 6, WINDING);

      SetWindowRgn(Button1.Handle, but1Rgn, False);

      //..треугольная кнопка

      Make3Angle(Button2.Width, Button2.Height, points);

      but2Rgn:= CreatePolygonRgn(points, 3, WINDING);

      SetWindowRgn(Button2.Handle, but2Rgn, False);

      //..пятиугольная кнопка

      Make5Angle(Button3.Width, Button3.Height, points);

      but3Rgn:= CreatePolygonRgn(points, 5, WINDING);

      SetWindowRgn(Button3.Handle, but3Rgn, False);

      //..форма в виде звезды

      MakeStar(Width, Height, points);

      formRgn:= CreatePolygonRgn(points, 5, WINDING);

      SetWindowRgn(Handle, formRgn, False);

      end;

      Особенностью создания регионов в приведенном листинге является использование дополнительных процедур для заполнения массива points координатами точек-вершин многоугольников определенного вида. Все эти процедуры принимают, помимо ссылки на сам массив points, ширину и высоту прямоугольника, в который должен быть вписан многоугольник. Описание процедуры создания треугольника приведено в листинге 1.13.

Листинг 1.13. Создание треугольника

      procedure Make3Angle(width, height: Integer; var points: array of TPoint);

      begin

      points[0].X:= 0;

      points[0].Y:= height – 1;

      points[1].X:= width div 2;

      points[1].Y:= 0;

      points[2].X:= width – 1;

      points[2].Y:= height – 1;

      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;

Скачать книгу