Отображение анимированных GIF-изображений

При разработке прикладных форм иногда может возникнуть необходимость отобразить анимированную 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(00));
    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;

См. также:

Примеры | ImageBox