【问题标题】:How to make form transparent while keeping the component visible?如何在保持组件可见的同时使表单透明?
【发布时间】:2012-04-23 07:28:35
【问题描述】:

我需要制作一个包含透明区域的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;

【问题讨论】:

  • 戳一下 :-) 你确定第一张截图上的图片真的是透明的吗?
  • 您不是在创建透明表单,而是在更改表单的形状。而是使用表单的ColorTransparentColorTransparentColorValue 属性并将png 加载到TImage,然后就完成了!

标签: delphi transparency transparent-control


【解决方案1】:

只需在您的表单中使用一个按钮删除此代码,您就会看到您的表单与您的 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;

【讨论】:

    【解决方案2】:

    如果您需要部分透明,那么 TransparentColor/TransparentColorValue 将无济于事。

    对于 NonAero(或 DisabledAero)和 EnabledAero 情况,您需要使用两种完全不同的方法。

    启用 Aero 后,您将不得不使用此类方法:http://delphihaven.wordpress.com/category/glass/

    当 Aero 被禁用或不存在时,您将不得不使用某种 hack:

    1. 设置 AlphaBlend := True;
    2. 通过BitBlt+GetDC+GetDesktopWindow制作桌面截图。您的窗口不会出现在该屏幕截图上。
    3. 在您的表单上绘制与您的表单具有相同位置和大小的屏幕截图部分。事实上,您将绘制表单背后的任何内容,这就是它看起来像透明的原因。
    4. 定期重复操作 2 和 3。

    【讨论】:

      猜你喜欢
      • 2011-02-17
      • 1970-01-01
      • 2022-01-10
      • 2013-10-31
      • 2018-10-11
      • 2015-12-31
      • 2022-01-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多