Какой самый простой способ добавить свойство AlphaBlendValue в TImage Delphi - PullRequest
2 голосов
/ 05 февраля 2011

В диалоговом окне отображается изображение с предупреждением, которое отображается при наличии сомнительных значений параметров. Пользователи не всегда это замечают, поэтому я хочу, чтобы они циклически появлялись и исчезали в течение секунды или около того (да, я мог бы просто переключать свойство Visible, но это выглядело бы как переключение свойства Visible). Есть ли более простой способ, чем поместить его в собственную форму и поместить его в диалоговое окно (и изменить свойство AlphaBlendValue формы)?

Ответы [ 2 ]

8 голосов
/ 05 февраля 2011

Вы можете сделать это, используя параметр Opacity TCanvas.Draw. За кулисами это вызывает 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.

1 голос
/ 05 февраля 2011

TImage не поддерживает альфа-прозрачность, как вы ищете. Использование отдельной плавающей TForm является самым простым вариантом.

...