2012-04-11 8 views
11

Jak uczynić przezroczystą formę przy zachowaniu widoczności komponentu?

Potrzebuję wykonać program, który ma jeden formularz, który zawiera obraz PNG z przezroczystym obszarem. Formularz musi być niewidoczny, a obraz musi być widoczny, a przezroczysty obszar musi pozostać przezroczysty. Problemem jest przezroczystość obrazu. W takim przypadku główna forma jest przezroczysta, niewidoczna, a wszystkie elementy/elementy sterujące pozostają widoczne. Ale przezroczysty obszar obrazu PNG nie zachowuje przezroczystości. Jak zachować przejrzystość?

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

Po prostu poke :-) Czy jesteś pewien, że obraz był naprawdę przezroczysty na pierwszym zrzucie ekranu? – TLama

+0

100% przezroczysty :) –

+5

Nie tworzysz przezroczystej formy, zmieniasz kształt formularza. Zamiast tego użyj właściwości 'Color',' TransparentColor' i 'TransparentColorValue' i załaduj png do' TImage' i gotowe! –

Odpowiedz

9

Wystarczy wrzucić ten kod za pomocą przycisku w formularzu, a zobaczysz swój formularz z PNG staje się przezroczysty:

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

Jeśli potrzebujesz częściowej przezroczystości, a następnie TransparentColor/TransparentColorValue nie będzie Wsparcie.

Będzie trzeba użyć dwóch całkowicie różnych metod dla sytuacji NonAero (lub DisabledAero) i EnabledAero.

Kiedy Aero jest włączona, trzeba będzie korzystać z takich metod: http://delphihaven.wordpress.com/category/glass/

Kiedy Aero jest wyłączona lub nie jest obecny, wtedy trzeba będzie użyć jakiegoś Hack:

  1. Set AlphaBlend: = Prawda;
  2. Wykonaj zrzut ekranu pulpitu BitBlt + GetDC + GetDesktopWindow. Twoje okno nie będzie na tym zrzucie ekranu.
  3. Narysuj na formularzu część ekranu, która ma taką samą pozycję i rozmiar jak formularz. W rzeczywistości będziesz rysował wszystko, co znajduje się za twoją formą, dlatego będzie wyglądał jak przezroczysty.
  4. Powtarzaj czynności 2 i 3 cyklicznie.
Powiązane problemy