При разработке прикладных форм иногда может возникнуть необходимость отобразить анимированную GIF-картинку. Компонент ImageBox позволяет отображать только статические изображения, в сборке Drawing также отсутствуют необходимые ресурсы для работы с анимированными изображениями. Для решения проблемы можно реализовать собственный компонент на языке Fore.NET, который будет наследовать компонент System.Windows.Forms.PictureBox и использовать для анимации класс System.Drawing.ImageAnimator. На Fore-форме подобный компонент может быть отображен в компоненте NetControlBox.
Пример пользовательского Fore.NET-компонента:
Imports System.Drawing;
Imports System.Windows.Forms;
Public Class AnimatedBox: PictureBox
animatedImage: Bitmap;
currentlyAnimating: Boolean = False;
Public Constructor Create(Path: string);
Begin
animatedImage := New Bitmap(Path);
Self.Width := 100;
Self.Height := 100;
Self.Paint += New PaintEventHandler(OnPaint);
End Constructor;
Private Sub OnFrameChanged(o: object; e: System.EventArgs);
Begin
//Принудительная отрисовка
компонента
Self.Invalidate();
End Sub OnFrameChanged;
Private Sub OnPaint(sender: System.Object; e: System.Windows.Forms.PaintEventArgs);
Begin
//При первой прорисовке компонента инициализируется отображение анимированной картинки
If (Not currentlyAnimating) Then
ImageAnimator.Animate(animatedImage, New System.EventHandler(OnFrameChanged));
currentlyAnimating := True;
End If;
//Обновление кадра
ImageAnimator.UpdateFrames();
//Отрисовка нового кадра
e.Graphics.DrawImage(animatedImage, New Point(0, 0));
End Sub;
End Class;
Путь до анимированного GIF-изображения передается в качестве параметра для конструктора компонента. После подписания компонента на событие Paint, при первой отрисовке осуществляется воспроизведение анимации изображения.
Для подключения данного компонента на Fore-форме можно использовать следующий код:
Sub Button1OnClick(Sender: Object; Args: IMouseEventArgs);
Var
MB: IMetabase;
Run: IForeNETRuntime;
NETAsm: IForeNETAssembly;
Asm, Asm1: IForeNETRuntimeAssembly;
Arg: IForeNETRuntimeMethodArgs;
Bind: IForeNETRuntimeMethodBinding;
Typ, Typ1: IForeNETRuntimeType;
Obj: IForeNETRuntimeObjectInstance;
Begin
MB := MetabaseClass.Active;
Run := ForeNETAssemblyClass.Runtime;
NETAsm := MB.ItemById("UserComponents").Bind As IForeNETAssembly;
Asm := Run.Assembly(NETAsm);
Asm1 := Run.SystemAssembly("mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=969db8053d3322ac");
Typ := Asm.Type("UserComponents.AnimatedBox");
Typ1 := Asm1.Type("System.String");
Arg := Run.CreateArgs(1);
//Путь до файла передается в конструктор в качестве параметра
Arg.Value(0) := "C:\sample.gif";
Bind := Run.CreateBinding(1);
Bind.Types.Item(0) := Typ1;
//Создание экземпляра компонента
Obj := Typ.CreateInstance(Arg, Bind);
//Отображение компонента в NetControlBox
NetControlBox1.AttachControl(Obj);
End Sub Button1OnClick;
См. также: