PDA

Ver la Versión Completa : Transparencias en las ventanas


rodriguezwalter
23-09-2010, 22:47:07
Hola a todos.

Necesito crear unas ventanas pero necesito que tengan transparencias y se vea lo que tienen detrás. Pensé en trabajar con gif pero no se cómo hacer lo delas transparencias enlasventanas.

La idea es poder crear ventanas que por lo menos en la apariencia tengan otra forma y no la típica rectangular.

Si alguien tiene una ideale agradecería.

Intento trabajar sin necesitar bajar componentes adicionales ya que los que hemos encontrado son pagos.


Gracias de antemano.

rgstuamigo
23-09-2010, 23:01:53
Para que tus ventanas tengan transparencias ,pues sencillamente utiliza dos propiedades que tiene todo formulario en delphi, dichas propiedades son: AlphaBlend y AlphaBlendValue, la primera debes ponerla en True para activar la transparencia y a la segunda debes darle un valor entre 0 y 255, por defecto viene con un valor de 255 lo que significa que la ventana no tiene ninguna transparencia, pero si ponemos un valor menor a 255 detectamos que al correr nuestra aplicacion ,nuestra ventana se ha hecho más transparente por ejemplo puedes poner un valor de 220 para probar.;). Desde luego si quieres más transparencia debes poner un valor menor.;)
Dichas propiedades las puedes modificar en tiempo de Diseño en el "Object Inspector".;).
Espero sea de utilidad.;)
Saludos...:)

rodriguezwalter
24-09-2010, 22:26:08
Muchas gracias.

Lo he probado y está muy interesante. No conocía esas propiedades.

Pregunto además.

¿Existe la posibilidad de hacer transparentes algunos componentes como por ejemplo el formulario y no una imágen que inserte en un timage por ejemplo?

Soy nuevo en esta parte.

Gracias desde ya.

gluglu
25-09-2010, 10:09:54
Si la imagen es parte de ese Formulario, y el form tiene activas las propiedades que se indican anteriormente, todos los componentes de ese Form serán transparentes.

Tendríar que 'plantar' un Form diferente sobre ese otro Form que es transparente, y que te hiciera dicha función.

Para cualquier tipo de 'movimientos' tendrás que tomar en cuenta los eventos correspondientes para al mover el form transparente, mover también el otro form no transparente.

No sé si esto es lo que preguntabas. :o

escafandra
26-09-2010, 00:33:33
Manejando regiones se puede crear el efecto deseado:
Creamos un form con un Timage. En el Timage cargamos un bitmap y añadimos el código:

unit Unit1;

interface

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

type
TForm1 = class(TForm)
Image1: TImage;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

ADWord = array [0..0] of DWORD;
PADWord = ^ADWord;

var
Form1: TForm1;


implementation

{$R *.dfm}
//---------------------------------------------------------------------------
procedure SkinControl(Control: TWinControl; bmp: TBitmap);
var
TransparentColor: DWORD;
rgn, rgnTemp: HRGN;
ini, x, y: integer;
Pixel: PADWord;
begin
bmp.HandleType:= bmDIB;
bmp.PixelFormat:= pf32bit;
Control.SetBounds(Control.Left, Control.Top, bmp.Width, bmp.Height);

TransparentColor:= PADWord(bmp.ScanLine[bmp.Height-1])[0];

rgn:= CreateRectRgn(0, 0, Control.Width, Control.Height);
CombineRgn(rgn, rgn, rgn, RGN_DIFF);

for y:=0 to bmp.Height-1 do
begin
Pixel:= PADWord(bmp.ScanLine[y]);
ini:= 0;
for x:=0 to bmp.Width-1 do
begin
if pixel[x] <> TransparentColor then
begin
rgnTemp:= CreateRectRgn(ini, y, x, y+1);
CombineRgn(rgn, rgn, rgnTemp, RGN_OR);
DeleteObject(rgnTemp);
ini:= x;
end
else inc(ini);
end;
end;
SetWindowRgn(Control.Handle, rgn, true);
DeleteObject(rgn);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
BorderStyle:= bsNone;
Image1.AutoSize:= false;
Image1.Left:= 0;
Image1.Top:= 0;
SkinControl(self, Image1.Picture.Bitmap);

end;

end.


Saludos.