Delphi FireMonkey中的AlphaBlend

Delphi FireMonkey中的AlphaBlend,delphi,firemonkey,alphablending,delphi-xe5,Delphi,Firemonkey,Alphablending,Delphi Xe5,如何在FireMonkey桌面应用程序中更改(表单的)值?它在VCL应用程序中可用,但我在FireMonkey中找不到它 截图: 要使窗体背景半透明,应将窗体的透明度属性设置为true,并使用Fill.Color和alpha值,如$aaffff(使用Fill.Kind=bkSolid)。 在这种情况下,表单边框变得不可见(至少在DelphiXE2中) 如果需要使窗体上的所有组件都半透明,则将TLayout放置在带有Align=alContents的窗体上,并将其Opacity属性设置为所需值

如何在FireMonkey桌面应用程序中更改(表单的)值?它在VCL应用程序中可用,但我在FireMonkey中找不到它

截图:


要使窗体背景半透明,应将窗体的透明度属性设置为
true
,并使用
Fill.Color
和alpha值,如
$aaffff
(使用
Fill.Kind=bkSolid
)。 在这种情况下,表单边框变得不可见(至少在DelphiXE2中)

如果需要使窗体上的所有组件都半透明,则将
TLayout
放置在带有
Align=alContents
的窗体上,并将其
Opacity
属性设置为所需值

如果您需要像VCL一样使用alpha blend的半透明窗口,您可以使用与
getWindowLong/SetWindowLong
相同的方法(对于Windows平台)。将
transparency
设置回
false
并在表单
OnCreate
事件处理程序中使用如下代码:

implementation
uses fmx.platform.win, winapi.windows;
{$R *.fmx}

procedure TMainForm.FormCreate(Sender: TObject);
var h : HWND;
    aStyle : integer;
    alphaValue : byte;
begin
    h := WindowHandleToPlatform(self.Handle).Wnd;
    AStyle := GetWindowLong(h, GWL_EXSTYLE);
    SetWindowLong(h, GWL_EXSTYLE, AStyle or WS_EX_LAYERED);


    AlphaValue := 125;
    SetLayeredWindowAttributes(h, 0, alphaValue, LWA_ALPHA);
end;

当然,您的所有组件也会变成trasparent。

因为您只寻找Windows实现,所以必须将样式添加到表单中,然后使用该方法以值或颜色为基础设置alpha值

使用插入器类检查此实现

type
  TForm   = class(FMX.Forms.TForm)
  private
    FAlphaBlend: Boolean;
    FAlphaBlendValue: Byte;
    FTransparentColor: Boolean;
    FTransparentColorValue: TColor;
    procedure SetAlphaBlend(const Value: Boolean);
    procedure SetAlphaBlendValue(const Value: Byte);
    procedure SetLayeredAttribs;
    procedure SetTransparentColor(const Value: Boolean);
    procedure SetTransparentColorValue(const Value: TColor);
  protected
    property AlphaBlend: Boolean read FAlphaBlend write SetAlphaBlend  default False;
    property AlphaBlendValue: Byte read FAlphaBlendValue write SetAlphaBlendValue default 255;
    property TransparentColor: Boolean read FTransparentColor write SetTransparentColor default False;
    property TransparentColorValue: TColor read FTransparentColorValue write SetTransparentColorValue;
  end;

  TForm1 = class(TForm)
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;


var
  Form1: TForm1;

implementation

{$R *.fmx}

uses
 FMX.Platform.Win,
 Winapi.Windows,
 Vcl.Graphics;

type
  TSetLayeredWindowAttributes = function (Hwnd: THandle; crKey: COLORREF;
    bAlpha: Byte; dwFlags: DWORD): Boolean; stdcall;

var
  SetLayeredWindowAttributes: TSetLayeredWindowAttributes = nil;

procedure TForm1.FormCreate(Sender: TObject);
begin
   @SetLayeredWindowAttributes := GetProcAddress(GetModuleHandle(User32), 'SetLayeredWindowAttributes');
   AlphaBlend:=True;
   AlphaBlendValue:=200;
end;

{ TForm }

procedure TForm.SetAlphaBlend(const Value: Boolean);
begin
  if FAlphaBlend <> Value then
  begin
    FAlphaBlend := Value;
    SetLayeredAttribs;
  end;
end;

procedure TForm.SetAlphaBlendValue(const Value: Byte);
begin
  if FAlphaBlendValue <> Value then
  begin
    FAlphaBlendValue := Value;
    SetLayeredAttribs;
  end;
end;

procedure TForm.SetTransparentColor(const Value: Boolean);
begin
  if FTransparentColor <> Value then
  begin
    FTransparentColor := Value;
    SetLayeredAttribs;
  end;
end;

procedure TForm.SetTransparentColorValue(const Value: TColor);
begin
  if FTransparentColorValue <> Value then
  begin
    FTransparentColorValue := Value;
    SetLayeredAttribs;
  end;
end;

procedure TForm.SetLayeredAttribs;
const
  cUseAlpha: array [Boolean] of Integer = (0, LWA_ALPHA);
  cUseColorKey: array [Boolean] of Integer = (0, LWA_COLORKEY);
var
  AStyle: Integer;
begin
  if not (csDesigning in ComponentState) and
    (Assigned(SetLayeredWindowAttributes))  then
  begin

    AStyle := GetWindowLong( WindowHandleToPlatform(Handle).Wnd, GWL_EXSTYLE);
    if FAlphaBlend or FTransparentColor then
    begin
      if (AStyle and WS_EX_LAYERED) = 0 then
        SetWindowLong(WindowHandleToPlatform(Handle).Wnd, GWL_EXSTYLE, AStyle or WS_EX_LAYERED);
      SetLayeredWindowAttributes(WindowHandleToPlatform(Handle).Wnd, ColorToRGB(FTransparentColorValue), FAlphaBlendValue,
        cUseAlpha[FAlphaBlend] or cUseColorKey[FTransparentColor]);
    end
    else
    begin
      SetWindowLong(WindowHandleToPlatform(Handle).Wnd, GWL_EXSTYLE, AStyle and not WS_EX_LAYERED);
      RedrawWindow(WindowHandleToPlatform(Handle).Wnd, nil, 0, RDW_ERASE or RDW_INVALIDATE or RDW_FRAME or RDW_ALLCHILDREN);
    end;
  end;
end;
类型
TForm=class(FMX.Forms.TForm)
私有的
FAlphaBlend:布尔;
FAlphaBlendValue:字节;
ftTransparentColor:布尔值;
ftTransparentColor值:TColor;
程序SetAlphaBlend(常量值:布尔值);
程序设置AlphablendValue(常量值:字节);
程序集LayeredAttribs;
过程SetTransparentColor(常量值:布尔值);
过程setTransparentColor值(常量值:TColor);
受保护的
属性AlphaBlend:Boolean read FAlphaBlend write SetAlphaBlend default False;
属性AlphaBlendValue:字节读取FAlphaBlendValue写入设置AlphaBlendValue默认值255;
属性TransparentColor:Boolean read fttransparentColor write SetTransparentColor default False;
属性TransparentColorValue:t颜色读取ftTransparentColorValue写入设置TransparentColorValue;
结束;
TForm1=类(TForm)
按钮1:t按钮;
过程表单创建(发送方:ToObject);
私有的
{私有声明}
公众的
{公开声明}
结束;
变量
表1:TForm1;
实施
{$R*.fmx}
使用
FMX.Platform.Win,
Winapi.Windows,
图形;
类型
TSetLayeredWindowAttributes=函数(Hwnd:THandle;crKey:COLORREF;
bAlpha:Byte;dwFlags:DWORD):布尔值;stdcall;
变量
SetLayeredWindowAttributes:TSetLayeredWindowAttributes=nil;
过程TForm1.FormCreate(发送方:TObject);
开始
@SetLayeredWindowAttributes:=GetProcAddress(GetModuleHandle(User32),'SetLayeredWindowAttributes');
AlphaBlend:=真;
AlphaBlendValue:=200;
结束;
{TForm}
过程TForm.SetAlphaBlend(常量值:布尔值);
开始
如果是混合值,则
开始
FAlphaBlend:=值;
SetLayeredAttribs;
结束;
结束;
过程TForm.SetAlphaBlendValue(常量值:字节);
开始
如果是FAlphaBlendValue值,则
开始
FAlphaBlendValue:=值;
SetLayeredAttribs;
结束;
结束;
过程TForm.SetTransparentColor(常量值:布尔值);
开始
如果是FTTransparentColor值,则
开始
ftTransparentColor:=值;
SetLayeredAttribs;
结束;
结束;
过程TForm.SetTransparentColor值(常量值:TColor);
开始
如果FTTransparentColorValue值,则
开始
ftTransparentColorValue:=值;
SetLayeredAttribs;
结束;
结束;
程序TForm.SetLayeredAttribs;
常数
cUseAlpha:整数=(0,LWA_ALPHA)的数组[Boolean];
cUseColorKey:整数=(0,LWA\U COLORKEY)的数组[Boolean];
变量
AStyle:整数;
开始
如果不是(组件状态下的csDesigning)和
(已分配(SetLayeredWindowAttributes))然后
开始
AStyle:=GetWindowLong(WindowHandleToPlatform(Handle).Wnd,GWL_EXSTYLE);
如果是FAlphaBlend或FTTransparentColor,则
开始
如果(AStyle和WS_EX_LAYERED)=0,则
SetWindowLong(WindowHandleToPlatform(Handle).Wnd、GWL_EXSTYLE、AStyle或WS_EX_LAYERED);
SetLayeredWindowAttributes(WindowHandleToPlatform(Handle).Wnd、ColorToRGB(ftTransparentColorValue)、FAlphaBlendValue、,
cUseAlpha[FAlphaBlend]或cUseColorKey[FTTransparentColor]);
结束
其他的
开始
SetWindowLong(WindowHandleToPlatform(Handle).Wnd、GWL_EXSTYLE、AStyle而非WS_EX_LAYERED);
重画窗口(WindowHandleToPlatform(Handle).Wnd、nil、0、RDW_擦除或RDW_无效或RDW_帧或RDW_所有子项);
结束;
结束;
结束;

检查
透明度
(可能使用Transparency)并使用
填充。颜色
与alpha通道值是否尝试更改窗体的透明度?您能否提供所需效果的图像?您正在寻找跨平台解决方案?还是只针对Windows?@RRUZ不。我认为这也不可能。只是谢谢。但最大的问题是形式边界。他们变得看不见了!我怎样才能解决这个问题?好的,@RRUZ已经发布了VCL的代码,我有点晚了:)不为我工作。。。我使用XE8指定了表单的Fill.Bitmap(启动屏幕)<代码>透明度为
填充。颜色
#AAFFFFFF
。您自己尝试过使用颜色键吗?虽然使用LWA_ALPHA对我来说很好,但我无法让其他部分工作,传递ColorKey(以及定义LWA_ColorKey)似乎没有任何效果。