ComCtl32.DLL Animation Control Class
A simple to use class for adding animations to your project
This article presents a simple class you can use to load AVIs from files or an application's resource file for display whilst the application is performing a long operation.
The ComCtl32.DLL Animation Control
The animation control provided with ComCtl32.DLL is a simple way of displaying AVI files asynchronously. You can see this control in use whenever you delete or copy large numbers of files from Windows Explorer: a small popup window shows and displays a copy or delete AVI along with a progress bar. The control itself is nice and simple: once created, you tell it to load an AVI and then it can either automatically start playing the AVI or you can start and stop the AVI manually and control exactly which frames are displayed. The AVI is played from a separate thread which means it continues to update even if your application is busy (note that this is only true when VB is running outside the IDE).
The control itself isn't actually much of a control: it's transparent to the mouse and only has two events, which you very rarely ever want to use: notification of the animation starting and stopping. So the approach taken here is to implement it as a class instead, and allow you to specify which object (form or control) you'd like the animation to be drawn on.
The cAnimControl Class
The class itself turns out to be 12k in size, which is rather smaller than using the MS controls for the same purpose (the VB5 one is 161k, with VB6 coming in at a fairly hefty 633k...). The class is a little tricker than a control because you can't set any properties outside code, but not very much as it only has a handful of properties and methods:
Loading Animations from Resource Files
Animations can be loaded from any EXE or DLL provided that they are created with the resource type "AVI". Here is a sample Resource File script (.rc file) for creating a compiled resource file containing an AVI at resource id 101:
// AVI 101 AVI "printing.avi"
To open the animation from the resource, you first specify the ResourceFileName if the resource is not in the current application's executable and then specify the animation resource id to load using the ResourceId. The class will attempt to load the resource as soon as ResourceId has been set. Note that if you're loading the resource from the local application (i.e. ResourceFileName is blank) then loading will only succeed when the application is compiled.
If You Really Do Want To Respond to Start, Stop Notifications
Although the class doesn't support Start and Stop notifications, its easy to add code to your project for them if you need to. Just reference the Subclassing and Timer Assistant and then add code like this:
Option Explicit Private Const WM_COMMAND = &H111& Private Const ACN_START = 1 Private Const ACN_STOP = 2 Private m_cAnim As cAnimControl Implements ISubClass Private Sub Form_Load() ' Attach to the window handle of the Owner ' of the cAnimControl class: AttachMessage Me, picAnim.hWnd, WM_COMMAND ' Create the animation control, and play once: Set m_cAnim = New cAnimControl m_cAnim.Filename = App.Path & "\download.avi" m_cAnim.Owner = picAnim m_cAnim.StartPlay , , 1 End Sub Private Property Let ISubClass_MsgResponse(ByVal RHS As EMsgResponse) ' End Property Private Property Get ISubClass_MsgResponse() As EMsgResponse ISubClass_MsgResponse = emrPostProcess End Property Private Function ISubClass_WindowProc( _ ByVal hWnd As Long, _ ByVal iMsg As Long, _ ByVal wParam As Long, _ ByVal lParam As Long) As Long If (iMsg = WM_COMMAND) Then If (lParam = m_cAnim.hWnd) Then Dim iCode As Long iCode = (wParam And &H7FFF0000) \ &H10000 Select Case iCode Case ACN_START Debug.Print "Started..." Case ACN_STOP Debug.Print "Stopped." End Select End If End If End Function