2011-02-05 3 views
2

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

ответ

8

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

+0

Это в основном способ, которым я это сделаю. Обратите внимание, что TCanvas.Draw позволяет передать параметр «непрозрачность», поэтому TAlphaBlendForm.PaintBox1Paint может быть таким же простым »PaintBox1.Canvas.Draw (0, 0, FBitmap, FAlpha)» – Giel

+0

@Giel Еще лучше! Я отредактирую свой ответ, чтобы сделать так. –

+0

Вы уверены, что 'TCanvas.Draw' имеет параметр« непрозрачность »с D2006? –

1

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