unit Elipse;

interface

uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Spin, Buttons, ExtCtrls;

type
 TFormaElipse = class(TForm) Panel2: TPanel; Image2: TImage;
    SpinEdit1: TSpinEdit;
    Image1: TImage;
 procedure FormCreate(Sender: TObject);
 procedure Panel2MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    procedure Timer1Timer(Sender: TObject);
    procedure Image2Click(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure Image1DblClick(Sender: TObject);
    procedure FormClick(Sender: TObject);

public
 procedure WMNCHitTest(var M: TWMNCHitTest); message wm_NCHitTest;

end;

var FormaElipse: TFormaElipse;

implementation

{$R *.DFM}

procedure TFormaElipse.WMNCHitTest(var M: TWMNCHitTest);
 var P: TPoint;
begin
// Este procedimiento permite definir lo que verá como el encabezamiento de la ventana
// no es nada del otro mundo solo un panel.
 inherited;
 GetCursorPos(P);
 P.X := P.X - Left;
 P.Y := P.Y - Top;
{ with Panel1 do
  if (P.X > Left) and (P.X < (Left + Width)) and (P.Y > Top) and (P.Y < (Top + Height)) then
   M.Result := htCaption;}
end;

procedure TFormaElipse.FormCreate(Sender: TObject);
 var A: array[0..10] of TPoint;
     I: Integer;
     Rgn, Rgn1: THandle;
begin
  // Todas la funciones aquí utilizada se encuentran en la Api de Window.
 //El procedimiento es muy fácil, solo hay que ir combinando las regiones que se crean

// Crea un región eliptica. Esta funcion esta en la API de WindoW
 Rgn := CreateEllipticRgn(0, 40, 550, 200);

 // Crea una región rectangular para combinarla con la eleptica ya definida.
 // Esta región será el header de la ventana

{ Rgn1 := CreateRoundRectRgn(0, 0, Panel1.Width, Panel1.Height, 50, 50);}
{ SetWindowRgn(Panel1.Handle, Rgn1, False);}

{ with Panel1 do
 Rgn1 := CreateRoundRectRgn(Left, Top, Left + Width, Top + Height, 50, 50);}
 CombineRgn(Rgn, Rgn, Rgn1, RGN_XOR);

 {Define las regiones para los botones de la esquinas. Son regiones rectangulares
 que toman las cordenadas de cada boton. Observe que cada vez que que se crea una
 región hay que combinarla con la primera creada.}

 for I := 0 to (ComponentCount - 1) do begin
  if (Components[I] is TBitBtn) then
   with (Components[I] as TBitBtn) do begin
    Rgn1 := CreateRectRgn(Left, Top, Left + Width, Top + Height);
    CombineRgn(Rgn, Rgn, Rgn1, RGN_XOR);
   end;
 end;

 {Crea una región vacia alrededor del Spin, prueve hacer click en esta parte
 a un icono de fondo y vera que se ejecuta lo que esta debajo.}
  with SpinEdit1 do begin
  {Rgn1 := CreateRoundRectRgn(Left - 15, Top - 15, (Left + Width) + 15, (Top + Height) + 15, 25, 25);
  CombineRgn(Rgn, Rgn, Rgn1, RGN_XOR);}
{ Rgn1 := CreateRectRgn(Left - 5, Top - 5, (Left + Width) + 5, (Top + Height) + 5);}
end;
{ CombineRgn(Rgn, Rgn, Rgn1, RGN_XOR);}
 SetWindowRgn(Handle, Rgn, True);

{El código que se muestra a continuación permite hacer un panel con forma irregular,
el arreglo de puntos constituye las coordenadas que tendrá la forma irregular de este
 panel, en este caso se dibujará una flecha roja que podrá ser movida.}
 A[0] := Point(0, 25);
 A[1] := Point(25, 0);
 A[2] := Point(15, 18);
 A[3] := Point(110, 18);
 A[4] := Point(150, 0);
 A[5] := Point(125, 25);
 A[6] := Point(150, 50);
 A[7] := Point(110, 32);
 A[8] := Point(15, 32);
 A[9] := Point(25, 50);
 A[10] := Point(0, 25);

 {Se crea una región poligonal con el arreglo de puntos, se envía la zona a donde se asignará
 esta región junto con la región definida. Todas estas funciones están en la API de Window}
 Rgn1 := CreatePolygonRgn(A, 11, ALTERNATE);
 SetWindowRgn(Panel2.Handle, Rgn1, True);
end;

procedure TFormaElipse.Panel2MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
{Para el movimiento de la flecha roja, estos procedimiento se encuentran en la API de Window}
 ReleaseCapture;
 SendMessage(Panel2.Handle, WM_SYSCOMMAND, $F012, 0);
end;

procedure TFormaElipse.Timer1Timer(Sender: TObject);
begin
Close;
//Timer1.Enabled:=False;
end;


procedure TFormaElipse.Image2Click(Sender: TObject);
begin
Close;
end;

procedure TFormaElipse.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
Close;
end;

procedure TFormaElipse.Image1DblClick(Sender: TObject);
begin
Close;
end;

procedure TFormaElipse.FormClick(Sender: TObject);
begin
Close;
end;

end.

