2

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

4

2 回答 2

8

您可以使用 的Opacity参数来执行此操作TCanvas.Draw。在幕后 this 调用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;

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

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;

感谢 Giel 提出 的Opacity参数TCanvas.Draw,并感谢 Sertac 指出它是TCanvas.Draw.

于 2011-02-05T12:22:20.567 回答
1

TImage 不支持您正在寻找的 alpha 透明度。使用单独的浮动 TForm 是最简单的选择。

于 2011-02-05T08:28:53.623 回答