Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to make form transparent while keeping the component visible?

I need to make the program which have one form that contains PNG image with transparent area. Form must be invisible, while image must stay visible and transparent area must stay transparent. The problem is image transparency. In this case, main form is transparent, invisible, while all components/controls stays visible. But, transparent area of PNG image doesn't keep transparency. How to keep transparency?

   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;
like image 343
Srdjan Vukmirica Avatar asked Apr 11 '12 00:04

Srdjan Vukmirica


Video Answer


1 Answers

If you need partial transparency, then TransparentColor/TransparentColorValue won't help.

You will need to use two completely different methods for NonAero (or DisabledAero) and EnabledAero situations.

When Aero is enabled, you will have to use such methods: http://delphihaven.wordpress.com/category/glass/

When Aero is disabled or not present, then you will have to use some sort of hack:

  1. Set AlphaBlend := True;
  2. Make screenshot of the desktop wia BitBlt+GetDC+GetDesktopWindow. Your window won't be on that screenshot.
  3. Draw on your form part of screenshot that has same position and size as your form. In fact you will be drawing whatever is behind your form, that is why it will look like transparent.
  4. Repeat actions 2 and 3 periodically.
like image 131
Torbins Avatar answered Sep 18 '22 20:09

Torbins