delphi - 如何使表单透明,同时保持组件可见?

标签 delphi transparency transparent-control

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

最佳答案

只需将此代码与按钮放在表单中,您就会看到带有 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;

关于delphi - 如何使表单透明,同时保持组件可见?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10098374/

相关文章:

android - 启动 Delphi Android 应用程序时为 "Class TForm1 not found"。应用程序运行良好

delphi - 无法播放原始音频文件

c# - Winforms:如何在透明窗体上获取鼠标事件以进行透明控制

.NET Compact Framework 3.5 动画透明等待光标

python PIL : Create indexed color image with transparent background

delphi - 透明组盒

delphi - 适用于 Delphi 的 Subversion 专属 checkout 和 Subversion 插件

delphi - TOSVersion 给出错误的结果

c# - 如何创建一个在其他控件之上工作的透明控件?

WPF:忽略鼠标点击覆盖/装饰器,但处理 MouseEnter 事件