RSS
StartseiteKnowledge LibraryTop 10Impressum

Film ab! - Animationen aus der Ressource

AVI Animation in Ressourcendateien auslagern und über das Animation Control wiedergeben.

Eine AVI Animation wiederzugeben ist dank des Animation Control kein Problem und eine AVI Datei ist auch schnell in einer Ressourcendatei verschwunden. Doch wie kommt die AVI Animation wieder ins Animation Control? Dieser Artikel verrät es Ihnen.

Animationen halten den Benutzer bei Laune, wenn ein Vorgang mal etwas länger dauern wird. Aus dem Explorer kennt man diese zum Beispiel vom Kopieren, Verschieben oder Löschen von Dateien. In VB können Sie ebenfalls Animationen nutzen, Mithilfe des Animation Control, das sich in den Windows Common Controls-2 befindet.

Soweit so gut, doch muss man die AVI Dateien entweder "lose" mit dem Programm ausliefern oder aber als Ressource mit der Anwendung kompilieren und bei Gebrauch aus dieser extrahieren, temporär auf der Festplatte speichern und nach Benutzung wieder löschen. Nachteilig, wenn das Programm aus irgendwelchen Gründen abstürzen sollte, denn die Temporärdatei verbleibt auf der Platte. Das direkte Öffnen von AVI Animationen aus der Ressource, wird vom Animation Control nicht unterstützt.

Wie so oft, kann man aber wieder über das API nachhelfen, denn eigentlich unterstützt das Animation Control diese Möglichkeit schon, nur wurde sie nicht in dem Wrapper "Windows Common Controls" berücksichtigt. Wenn Sie allerdings die Pfade des Animation Control verlassen, müssen Sie alle Aktionen per API abwickeln, denn es wird nicht davon informiert, wenn eine Animation aus der Ressource geladen wurde und die Methoden Play oder Stop würden einen Laufzeitfehler hervorrufen.

Zunächst wird eine AVI Ressource benötigt. Dazu kann man die gewünschte Animation über den Ressourcen Editor von VB6 (Add-Ins) als benutzerdefinierte Ressource einfügen. Damit die Ressource auch gefunden wird, muss sie als "AVI" deklariert sein. Dazu ist die Ressource auszuwählen und unter Eigenschaften > "Typ" "AVI" einzutragen.

In einem Ressourcen Skript könnte ein solcher Eintrag, wie folgt aussehen:

101	AVI	FILECOPY.AVI

Folgende Deklarationen werden zur Steuerung des Animation Control per API benötigt:

Private Const WM_USER = &H400
Private Const ACM_OPEN = (WM_USER + 100)
Private Const ACM_PLAY = (WM_USER + 101)
Private Const ACM_STOP = (WM_USER + 102)

Private Declare Function SendMessage Lib "user32" _
        Alias "SendMessageA" ( _
        ByVal hwnd As Long, _
        ByVal wMsg As Long, _
        ByVal wParam As Long, _
        ByRef lParam As Any _
              ) As Long

Bevor eine AVI Animation abgespielt werden kann, muss natürlich erst eine Animation geöffnet werden. Dies erfolgt über SendMessage und der Nachricht ACM_OPEN. "wParam" gibt dabei den Instanzen-Handle der Anwendung an, die die Ressource enthält, in diesem Fall App.hInstance. "lParam" bestimmt den gewünschten Ressourcen Identifier, wie er im Ressourceneditor bzw. im Ressourcen Skript festgelegt wurde. Zum Beispiel 101:

SendMessage Animation1.hwnd, ACM_OPEN, App.hInstance, ByVal 101&

Hinweis: App.hInstance liefert während des Debuggens in der IDE den Instanzen-Handle der IDE und nicht den des ausgeführten Projekts. Die Ressourcen sind nicht unter diesem Handle zu finden, deshalb funktioniert die Anzeige und Wiedergabe der Animation nur im kompiliertem Projekt.

ACM_PLAY beginnt die Wiedergabe der zuvor geladenen Animation. Dabei kann über "wParam" festgelegt werden, wie oft die Animation wiederholt werden soll. "-1" steht dabei für Endlos- Wiedergabe. "lParam" nimmt gleich zwei Integer "huckepack". Der LoWord Wert bestimmt dabei das Startframe, ab dem gespielt werden soll und der HiWord Wert legt das Endframe fest, bis zu dem gespielt werden soll. Wird im LoWord der Wert 0 und im HiWord der Wert -1 angegeben, wird die gesamte Animation wiedergegeben. Nehmen LoWord und HiWord den gleichen Wert an, wird das entsprechende Frame der Animation angezeigt:

SendMessage(Animation1.hwnd, ACM_PLAY, -1, ByVal CLng(-1 * &H10000 + 0))

ACM_STOP beendet die Wiedergabe. Die Parameter "wParam" und "lParam" werden dabei nicht benötigt:

SendMessage(Animation1.hwnd, ACM_STOP, 0&, ByVal 0&)
Das Entladen der Animation erfolgt, wie beim Öffnen, über ACM_OPEN. Der Parameter
"lParam" ist dabei NULL. Die Anzeige kann durch das Aus- und Einblenden des Animation
Controls erreicht werden:
SendMessage(Animation1.hwnd, ACM_OPEN, App.hInstance, ByVal vbNullString)

Zusammengefasst in einer Funktion:

Public Enum ResAnimateConstants
  ranOpen = 1
  ranPlay = 2
  ranSeek = 3
  ranStop = 4
  ranClose = 5
End Enum

Public Function ResAnimate(ByRef Animation As Animation, _
                           ByVal Cmd As ResAnimateConstants, _
                  Optional ByVal ID As Long, _
                  Optional ByVal StartFrame As Integer = 0, _
                  Optional ByVal EndFrame As Integer = -1, _
                  Optional ByVal Repeat As Long = -1) As Boolean
  Dim lngRet As Long

  Select Case Cmd
    Case ranOpen
      '// Animation laden:
      lngRet = SendMessage(Animation.hwnd, ACM_OPEN, App.hInstance, ByVal ID)
    Case ranPlay
      '// Animation abspielen:
      lngRet = SendMessage(Animation.hwnd, ACM_PLAY, Repeat, _
                           ByVal CLng(EndFrame * &H10000 + StartFrame))
    Case ranSeek
      '// Bestimmtes Frame (StartFrame) abspielen:
      lngRet = SendMessage(Animation.hwnd, ACM_PLAY, 1, _
                           ByVal CLng(StartFrame * &H10000 + StartFrame))
    Case ranStop
      '// Animation anhalten:
      lngRet = SendMessage(Animation.hwnd, ACM_STOP, 0&, ByVal 0&)
    Case ranClose
      '// Animation schließen:
      lngRet = SendMessage(Animation.hwnd, ACM_OPEN, App.hInstance, _
                           ByVal vbNullString)
      '// Anzeige durch aus- und wiedereinblenden löschen:
      Animation.Visible = False
      Animation.Visible = True
  End Select
  
  ResAnimate = (lngRet <> 0)
  
End Function

Hinweis: Das Laden von AVI Animationen aus einer Ressourcendatei wird erst ab ComCtl32.dll Version 4.71 (IE4/Win98) Unterstützt. Das Animation Control Version 5.0 implementiert auf Basis dieser Bibliothek. Daher ist es erforderlich diese bei der Installation Ihrer Anwendung auf älteren Systemen zu aktualisieren, was über das entsprechende Redist-Package problemlos möglich ist.