2012-04-11 17 views
11

¿Cómo hacer que la forma sea transparente mientras se mantiene el componente visible?

Necesito hacer el programa que tiene un formulario que contiene una imagen PNG con área transparente. El formulario debe ser invisible, mientras que la imagen debe permanecer visible y el área transparente debe permanecer transparente. El problema es la transparencia de la imagen. En este caso, la forma principal es transparente, invisible, mientras que todos los componentes/controles permanecen visibles. Pero, el área transparente de la imagen PNG no mantiene la transparencia. ¿Cómo mantener la transparencia?

procedure MakeTransparent; 
    var 
    AControl: TControl; 
    A, Margin, X, Y, CtlX, CtlY: Integer; 
    begin 
    Margin := (Width - ClientWidth) div 2; 
    FullRgn := CreateRectRgn(0, 0, Width, Height); 
    X   := Margin; 
    Y   := Height - ClientHeight - Margin; 
    ClientRgn := CreateRectRgn(X, Y, X + ClientWidth, Y + ClientHeight); 
    CombineRgn(FullRgn, FullRgn, ClientRgn, RGN_DIFF); 
    for A := 0 to ControlCount - 1 do 
    begin 
    AControl := Controls[A]; 
    if (AControl is TWinControl) or (AControl is TGraphicControl) then with  AControl do 
    begin 
    if Visible then 
    begin 
     CtlX := X + Left; 
     CtlY := Y + Top; 
     CtlRgn := CreateRectRgn(CtlX, CtlY, CtlX + Width, CtlY + Height); 
     CombineRgn(FullRgn, FullRgn, CtlRgn, RGN_OR); 
    end; 
    end; 
    end; 
    SetWindowRgn(Handle, FullRgn, True); 
    end; 



    procedure UndoTransparency; 
    begin 
    FullRgn := CreateRectRgn(0, 0, Width, Height); 
    CombineRgn(FullRgn, FullRgn, FullRgn, RGN_COPY); 
    SetWindowRgn(Handle, FullRgn, True); 
    end; 
+1

Solo un poke :-) ¿Estás seguro de que la imagen fue realmente transparente en la primera captura de pantalla? – TLama

+0

100% transparente :) –

+5

No está creando un formulario transparente, está cambiando la forma del formulario. En su lugar, use las propiedades 'Color',' TransparentColor' y 'TransparentColorValue' del formulario y cargue un png en' TImage' y ¡listo! –

Respuesta

9

tan sólo reduce este código con un botón en su forma y verá su formulario con sus PNG ser transparente:

procedure SetTransparent(Aform: TForm; AValue: Boolean); 
begin 
    Aform.TransparentColor := AValue; 
    Aform.TransparentColorValue := Aform.Color; 
end; 

procedure TForm2.Button1Click(Sender: TObject); 
begin 
    SetTransparent(Self, True); 
end; 
3

Si necesita transparencia parcial, entonces TransparentColor/TransparentColorValue no lo hará ayuda.

Tendrá que utilizar dos métodos completamente diferentes para las situaciones NonAero (o DisabledAero) y Enable One.

Cuando está activado Aero, que tendrá que utilizar tales métodos: http://delphihaven.wordpress.com/category/glass/

Cuando Aero está deshabilitado o no está presente, entonces usted tendrá que usar algún tipo de truco:

  1. Conjunto AlphaBlend: = Verdadero;
  2. Haga una captura de pantalla del escritorio con BitBlt + GetDC + GetDesktopWindow. Su ventana no estará en esa captura de pantalla.
  3. Dibuje en su formulario parte de la captura de pantalla que tiene la misma posición y tamaño que su formulario. De hecho, dibujará lo que esté detrás de su forma, es por eso que se verá transparente.
  4. Repita las acciones 2 y 3 periódicamente.
Cuestiones relacionadas