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:
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...
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.
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
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
Eso esta muy bien, pero cuando yo escribí este artículo también pensaba en Delphi 5, cuya propiedad TransparentColor no existe.
Saludos.
y donde tengo que poner todo ese codigo podrias explicarmelo por fa.
Este procedimiento lo puedes implementar en cualquier formulario. Después lo llamas en el evento OnCreate.
Saludos.
Publicar un comentario