У меня есть «осторожное» изображение в диалоговом окне, которое отображается, если есть сомнительные значения параметров. Пользователи не всегда замечают это, поэтому я хочу, чтобы он постепенно и постепенно исчезал и циклически (да, я мог бы просто переключить свойство Visible, но это будет похоже на то, что я просто переключил свойство Visible). Есть ли более простой способ, чем поместить его в свою собственную форму и поместить его по диалогу (и изменить свойство AlphaBlendValue формы)?Каков самый простой способ добавить свойство AlphaBlendValue в TImage Delphi
2
A
ответ
8
Вы можете сделать это, используя параметр Opacity
TCanvas.Draw
. За кулисами это вызывает TGraphic.DrawTransparent
, который в свою очередь вызывает функцию API Windows AlphaBlend
. Самый простой способ реализовать это с 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 предложившего параметр TCanvas.Draw
Opacity
, и для Sertaç для указывая на то, что это довольно недавнее дополнение к TCanvas.Draw
.
1
TImage не поддерживает альфа-прозрачность, как вы ищите. Использование отдельного плавающего TForm - самый простой вариант.
Это в основном способ, которым я это сделаю. Обратите внимание, что TCanvas.Draw позволяет передать параметр «непрозрачность», поэтому TAlphaBlendForm.PaintBox1Paint может быть таким же простым »PaintBox1.Canvas.Draw (0, 0, FBitmap, FAlpha)» – Giel
@Giel Еще лучше! Я отредактирую свой ответ, чтобы сделать так. –
Вы уверены, что 'TCanvas.Draw' имеет параметр« непрозрачность »с D2006? –