2012-04-11 18 views
11

Bileşeni tutarken nasıl şeffaf hale getirilir?

Saydam alanlı PNG görüntüsünü içeren bir forma sahip olan programı yapmam gerekiyor. Form görünmez olmalı, görüntü görünür kalmalı ve şeffaf alan şeffaf kalmalıdır. Sorun görüntü şeffaflığıdır. Bu durumda, ana form şeffaftır, görünmezdir, tüm bileşenler/kontroller görünür durumda kalır. Ancak, PNG görüntüsünün şeffaf alanı saydamlık taşımaz. Şeffaflık nasıl korunur?

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

Sadece bir poke :-) İlk ekran görüntüsünde görüntünün gerçekten şeffaf olduğundan emin misiniz? – TLama

+0

100% transparent :) –

+5

Saydam bir form oluşturmuyorsunuz, formun şeklini değiştiriyorsunuz. Bunun yerine, formun "Renk", "TransparentColor" ve "TransparentColorValue" özelliklerini kullanın ve bir "TImage" öğesine bir png yükleyin ve işiniz bitti! –

cevap

9

Sadece Formu'na bir düğme ile bu kodu bırakın ve size PNG şeffaf hale ile Form görürsünüz:

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

kısmi saydamlık gerekiyorsa, o zaman TransparentColor/TransparentColorValue olmaz yardım et.

NonAero (veya DisabledAero) ve EnabledAero durumları için iki farklı yöntem kullanmanız gerekecektir.

Aero etkinleştirildiğinde, bu tür yöntemleri kullanmak zorunda kalacak

: http://delphihaven.wordpress.com/category/glass/

Aero mevcut engelli ya değilse, o zaman hack çeşit kullanmak zorunda olacak:

  1. Seti AlphaBlend: = Doğru;
  2. Masaüstü wia BitBlt + GetDC + GetDesktopWindow'un ekran görüntüsünü alın. Penceren o ekran görüntüsünde olmayacak.
  3. Formunuzda, formunuzla aynı konumda ve boyutta olan ekran görüntüsünün bir kısmını çizin. Aslında, formunuzun arkasında ne varsa çizeceksiniz, bu yüzden şeffaf gibi görünecektir.
  4. Düzenli olarak 2 ve 3 numaralı eylemleri tekrarlayın.
İlgili konular