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

div 5,

      Button3.Height div 5);

      SetWindowRgn(Button3.Handle, but3Rgn, False);

      //Регион для окна

      formRgn:= CreateRoundRectRgn(0, 0, Width–1, Height–1,

      Width div 5, Height div 5);

      SetWindowRgn(Handle, formRgn, False);

      end;

      В листинге 1.11 размеры округляющих эллипсов вычисляются в зависимости от размеров конкретного окна (20 % от ширины и 20 % от высоты). Это смотрится не всегда красиво. В качестве альтернативы для ширины и высоты скругляющих эллипсов можно использовать фиксированные небольшие значения.

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

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

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

      Рис. 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;

      points[3].X:= a div 2;

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

      points[4].X:= 0;

      points[4].Y:= a div 2;

      end;

      Пятиугольная

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