2012-04-11 1 views
11

Comment rendre la forme transparente tout en gardant le composant visible?

Je dois faire le programme qui a une forme qui contient l'image PNG avec la zone transparente. Le formulaire doit être invisible, tandis que l'image doit rester visible et la zone transparente doit rester transparente. Le problème est la transparence de l'image. Dans ce cas, la forme principale est transparente, invisible, alors que tous les composants/contrôles restent visibles. Mais, la zone transparente de l'image PNG ne conserve pas la transparence. Comment garder la transparence?

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

Juste un coup de pouce :-) Êtes-vous sûr que l'image était vraiment transparente sur la première capture d'écran? – TLama

+0

100% transparent :) –

+5

Vous ne créez pas de formulaire transparent, vous modifiez la forme du formulaire. Utilisez plutôt les propriétés 'Color',' TransparentColor' et 'TransparentColorValue' du formulaire et chargez un png dans un' TImage' et vous avez terminé! –

Répondre

9

Il suffit de déposer ce code avec un bouton dans votre formulaire et vous verrez votre formulaire avec votre PNG devenir transparent:

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 vous avez besoin de transparence partielle, puis TransparentColor/TransparentColorValue ne sera pas Aidez-moi.

Vous devrez utiliser deux méthodes complètement différentes pour les situations NonAero (ou DisabledAero) et EnabledAero.

Lorsque Aero est activé, vous devrez utiliser ces méthodes: http://delphihaven.wordpress.com/category/glass/

Lorsque Aero est désactivé ou non présent, alors vous devrez utiliser une sorte de pirater:

  1. Set AlphaBlend: = Vrai;
  2. Faire une capture d'écran du bureau wia BitBlt + GetDC + GetDesktopWindow. Votre fenêtre ne sera pas sur cette capture d'écran. Dessinez sur votre formulaire une partie de la capture d'écran qui a la même position et la même taille que votre formulaire. En fait, vous allez dessiner tout ce qui est derrière votre forme, c'est pourquoi il va sembler transparent.
  3. Répéter les actions 2 et 3 périodiquement.
Questions connexes