向Delphi的TImage添加AlphaBlendValue属性的最简单方法是什么?

ros*_*mcm 2 delphi transparency timage alphablending delphi-2006

如果有可疑的参数值,则会在对话框中显示"警告"图像.用户并不总是会注意到它,所以我想在一秒左右的时间内循环淡入淡出(是的,我可以切换Visible属性,但这看起来有点像我只是切换Visible属性).有没有比将它放在自己的表单上并将其浮动在对话框上(以及更改表单的AlphaBlendValue属性)更简单的方法?

Dav*_*nan 8

您可以使用Opacity参数of 来执行此操作TCanvas.Draw.在幕后,这会调用TGraphic.DrawTransparent哪些调用Windows AlphaBlendAPI函数.实现这一目标的简单方法是TPaintBox:

procedure TAlphaBlendForm.FormCreate(Sender: TObject);
begin
  FBitmap := TBitmap.Create;
  FBitmap.Assign(Image1.Picture.Graphic);//Image1 contains a transparent PNG
  PaintBox1.Width := FBitmap.Width;
  PaintBox1.Height := FBitmap.Height;
  Timer1.Interval := 20;
end;

procedure TAlphaBlendForm.PaintBox1Paint(Sender: TObject);
begin
  PaintBox1.Canvas.Draw(0, 0, FBitmap, FOpacity);
end;

procedure TAlphaBlendForm.Timer1Timer(Sender: TObject);
begin
  FOpacity:= (FOpacity+1) mod 256;
  PaintBox1.Invalidate;
end;
Run Code Online (Sandbox Code Playgroud)

如果您使用的是没有Opacity参数的旧版Delphi ,TCanvas.Draw可以AlphaBlend直接使用.

procedure TAlphaBlendForm.PaintBox1Paint(Sender: TObject);
var
  fn: TBlendFunction;
begin
  fn.BlendOp := AC_SRC_OVER;
  fn.BlendFlags := 0;
  fn.SourceConstantAlpha := FOpacity;
  fn.AlphaFormat := AC_SRC_ALPHA;
  Windows.AlphaBlend(
    PaintBox1.Canvas.Handle,
    0,
    0,
    PaintBox1.Width,
    PaintBox1.Height,
    FBitmap.Canvas.Handle,
    0,
    0,
    FBitmap.Width,
    FBitmap.Height,
    fn
  );
end;
Run Code Online (Sandbox Code Playgroud)

感谢Giel建议的Opacity参数TCanvas.Draw,以及Sertac指出它是最近添加的TCanvas.Draw.