Cómo personalizar la forma de un formulario

4908 vistas

Este método permite obtener formularios no rectangulares. Para ello tenemos que realizar 2 tareas.

1. Crear la zona a mostrar:
Con ayuda de las siguientes funciones, devemos de crear esta zona.



delphi
  1. CreateEllipticRgn(X1, Y1, X2, Y2: integer);
  2. CreateEllipticRgnIndirect(Rect: TRect);



Estas dos funciones crean una región elÃptica. Las coordenadas pasadas deberán ser deacuerdo a la medida del formulario.

Los procedimientos para generar zonas rectangulares y rectángulos redondeados funcionan del mismo modo:



delphi
  1. CreateRectRgn(X1, Y1, X2, Y2: integer);
  2. CreateRoundrectRgn(X1, Y1, X2, Y2, rayonarrondihor, rayonarrondivert: integer);



También podemos generar una región poligonal con la ayuda de la siguente función:



delphi
  1. CreatePolygonRgn(lppt: Array Of TPoint; cPoints, PolyFillMode: integer);



Donde:
lppt es un array que contiene los puntos del poligono
cPoints indica el número de puntos del polÃgono
PolyFillMode es una constante correspondiente al modo de llenado del polÃgono.



delphi
  1. Var
  2.   T: array[0..2] of TPoint;
  3.   i: Integer;
  4. begin
  5.   { rellenamos el array }
  6.   For i := 0 to 2 do T[i] := Point(Random(Width), Random(Height));
  7.   { creamos la región }
  8.   Rgn := CreatePolygonRgn(T, 3, WINDING);
  9. end;



2. Definir esta zona a mostrar como zona de nuestro formulario:
Ahora necesitamos decirle a nuestro formulario que use esta región. Para ello tenemos la siguiente función



delphi
  1. SetWindowRgn(hWnd: HNWD, hRng: HRNG, bRedraw: LongBool): Integer



Donde:
hWnd corresponde al handle de nuestro formulario
hRng la región donde mostrar el formulario
bRedraw para indicar si queremos refrescar nuestro formulario immediatamente o no

Todo lo que esté en el área definida se mostrará, todo lo demás no.

Ahora sólo queda codificar el OnCreate del formulario



delphi
  1. Var
  2.   Rgn : Hrgn;
  3.   ...
  4. begin
  5.   ...
  6.   Rgn := CreateEllipticRgn(1,1,100,50); { una elipse alargada }
  7.   SetWindowsRgn(Handle, Rgn, true);
  8.   ...
  9. end;