unit Unit3;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TfrmPoly = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    procedure Button3Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  frmPoly: TfrmPoly;

implementation

{$R *.dfm}

procedure TfrmPoly.Button3Click(Sender: TObject);
begin
  Close;
end;

//Процедура создает шестиугольник, который можно вписать в прямоугольник с
//заданной шириной и высотой
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;

//Процедура создает треугольник, который можно вписать в прямоугольник с
//заданной шириной и высотой
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;

//Процедура создает пятиугольник, который можно вписать
//в прямоугольник с заданной шириной и высотой
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;

procedure Swap(var p1, p2 :TPoint);
var buf: TPoint;
begin
  buf  := p1;
  p1 := p2;
  p2 := buf;
end;

//Процедура создает пятиугольную звезду, которую можно вписать
//в прямоугольник с заданной шириной и высотой
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;

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;

end.
