如何使表单透明而保持组件可见?

11

我需要制作一个程序,其中包含一个具有透明区域的PNG图像的表单。表单必须是不可见的,而图像必须保持可见,并且透明区域必须保持透明。问题在于图像的透明度。在这种情况下,主表单是透明的、不可见的,而所有组件/控件都是可见的。但是,PNG图像的透明区域不保持透明。如何保持透明度?

   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
只是打个招呼,你确定第一张截图上的图片确实是透明的吗? - TLama
5
你不是在创建一个透明的形式,而是在改变表单的形状。相反,使用表单的ColorTransparentColorTransparentColorValue 属性,然后将png加载到 TImage中即可完成! - Sertac Akyuz
2个回答

11

只需将此代码与按钮一起放置在您的表单中,您就可以看到您的带有PNG的表单变为透明:

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;

4
如果您需要部分透明度,那么TransparentColor/TransparentColorValue将无法帮助您。
对于NonAero(或DisabledAero)和EnabledAero的情况,您需要使用两种完全不同的方法。
当启用了Aero时,您将必须使用这些方法: http://delphihaven.wordpress.com/category/glass/ 当Aero被禁用或不存在时,您将必须使用某种黑客方法:
  1. 设置AlphaBlend := True;
  2. 使用BitBlt+GetDC+GetDesktopWindow截取桌面的截图。您的窗口不会出现在该截图中。
  3. 在您的窗体上绘制与您的窗体相同位置和大小的截图部分。事实上,您将绘制在您窗体后面的任何内容,因此它看起来像是透明的。
  4. 周期性地重复步骤2和步骤3。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接