26 junio 2007

Formularios transparentes

Si estais hartos de que vuestros formularios tengan el mismo aspecto soso de siempre podeis crear nuevos temas y skins tales como los reproductores BSPlayer, WinDVD, PowerDVD, etc.

Para ello tenemos aquí un procedimiento que toma como parámetro un formulario y que hará que todo su fondo sea transparente. Si queremos que algo no sea transparente lo ponemos dentro de un bitmap, shape o panel.

procedure TransparentarFormulario( Form: TForm );
var
Region, RegionTemp: HRGN;
i: Integer;
Rect: TRect;
begin
Region := 0;

for i := 0 to Form.ControlCount - 1 do
begin
Rect := Form.Controls[i].BoundsRect;
OffsetRect( Rect, Form.ClientOrigin.x - Form.Left, Form.ClientOrigin.y - Form.Top );
RegionTemp := CreateRectRgnIndirect( Rect );

if Region = 0 then
Region := RegionTemp
else
begin
CombineRgn( Region, Region, RegionTemp, RGN_OR );
DeleteObject( RegionTemp );
end;
end;

RegionTemp := CreateRectRgn( 0, 0, Form.Width,
GetSystemMetrics( SM_CYCAPTION )+
GetSystemMetrics( SM_CYSIZEFRAME )+
GetSystemMetrics( SM_CYMENU ) * Ord( Form.Menu <> nil ) );

CombineRgn( Region, Region, RegionTemp, RGN_OR );
DeleteObject( RegionTemp );
SetWindowRgn( Form.Handle, Region, True );
end;

Quitando los margenes de la ventana con BorderStyle = bsNone ya tenemos un formulario completamente transparente donde sólo hay que insertarle los objetos que van a ser visibles.

Pruebas realizadas en Delphi 7.

7 comentarios:

Anónimo dijo...

Funciona bien, pero el problema al configurar bsnone es que se pierde la barra que contiene el titulo y los botones de minimizar, etc. y entonces ya no es posible mover el form por la pantalla.

Me interesaria saber si hay alguna forma no demasiado complicada para poder hacer que por ejemplo cuando el puntero del raton esté situado (mouseover) sobre una determinado icono, el usuario pueda hacer click sobre él y al arrastrar el raton pues que se mueva la posicion de todo el form, que es lo que ocurre haciendo click+arrastrando en la barra de titulo de un form normal no transparente...

Administrador dijo...

Para solucionar eso lo que tienes que hacer es crear tu propia barra de título. Yo suelo poner un rectángulo de fondo (TShape) en la parte superior de la ventana y en su evento OnMouseDown escribes lo siguiente:

ReleaseCapture;
Perform( WM_SYSCOMMAND, $F012, 0 );

Con esto no sólo podrás hacer formularios transparentes sino que además puedes crear tus propios temas visuales pasando del tema de Windows.

Saludos.

rgstuamigo dijo...

Yo no se por que tanto lío para hacer un formulario transparente si solamente se debe hacer el sguiente truquito que esta en esta pagina:
http://www.clubdelphi.com/trucos/index.php?id=491&scroll=0&scrollb=0

rgstuamigo dijo...

Yo no se por que tanto lío para hacer un formulario transparente si solamente se debe hacer el sguiente truquito que esta en esta pagina:
http://www.clubdelphi.com/trucos/index.php?id=491&scroll=0&scrollb=0

Administrador dijo...

Eso esta muy bien, pero cuando yo escribí este artículo también pensaba en Delphi 5, cuya propiedad TransparentColor no existe.

Saludos.

Anónimo dijo...

y donde tengo que poner todo ese codigo podrias explicarmelo por fa.

Administrador dijo...

Este procedimiento lo puedes implementar en cualquier formulario. Después lo llamas en el evento OnCreate.

Saludos.

Publicidad