如果有可疑的参数值,我会在对话框中显示“警告”图像。用户并不总是注意到它,所以我想在一秒钟左右的时间内循环淡入和淡出它(是的,我可以切换 Visible 属性,但这看起来有点像我只是切换 Visible 属性)。有没有比将它放在自己的表单上并将其浮动在对话框上(并更改表单的 AlphaBlendValue 属性)更简单的方法?
问问题
1275 次
2 回答
8
您可以使用 的Opacity
参数来执行此操作TCanvas.Draw
。在幕后 this 调用TGraphic.DrawTransparent
又调用 Windows AlphaBlend
API 函数。实现这一点的一种简单方法是使用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.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;
感谢 Giel 提出 的Opacity
参数TCanvas.Draw
,并感谢 Sertac 指出它是TCanvas.Draw
.
于 2011-02-05T12:22:20.567 回答
1
TImage 不支持您正在寻找的 alpha 透明度。使用单独的浮动 TForm 是最简单的选择。
于 2011-02-05T08:28:53.623 回答