11 votes

Comment rendre le formulaire transparent tout en gardant le composant visible ?

J'ai besoin de créer le programme qui contient un formulaire contenant une image PNG avec une 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, le formulaire principal est transparent, invisible, tandis que tous les composants/contrôles restent visibles. Mais, la zone transparente de l'image PNG ne conserve pas sa transparence. Comment conserver 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;

11voto

François Points 17557

Il suffit de placer 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;

4voto

Torbins Points 1438

Si vous avez besoin de transparence partielle, alors TransparentColor/TransparentColorValue ne vous aidera pas.

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 de telles méthodes : http://delphihaven.wordpress.com/category/glass/

Lorsque Aero est désactivé ou n'est pas présent, vous devrez utiliser une sorte de hack :

  1. Définissez AlphaBlend := True;
  2. Prenez une capture d'écran du bureau via BitBlt+GetDC+GetDesktopWindow. Votre fenêtre ne sera pas sur cette capture d'écran.
  3. Dessinez sur votre formulaire une partie de la capture d'écran qui a la même position et taille que votre formulaire. En fait, vous dessinerez ce qui se trouve derrière votre formulaire, c'est pourquoi cela semblera transparent.
  4. Répétez les actions 2 et 3 périodiquement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X