Play movies with an ActiveX control

I’ve been using Canon Powershot cameras for years, and they take movies in AVI format as well as being a good camera.

I store my photos and movies in the same folders, and use the same database to store them.

To display the movies, I add a Windows Media Player ActiveX control. There have been various versions of Media Player over the years, with varying architectures. You may have to Regsvr32 c:\WINDOWS\system32\msdxm.ocx

For some reason, the events didn’t quite work right on one of my machines. Simple solution: I found the events code in c:\windows\system32\amcompat.tlb, and I started the VFP Object Browser, navigated to this file, then dragged the interface DActiveMovieEvents2 into a program file to have the IMPLEMENTS code auto-generated.

Sample code in Fox and VB is below.

For the VB version, you need to right click on the Toolbox, Choose Items…, then check the COM ActiveMovieControl Object (Microsoft ActiveMovie Control).

See also

Sharing Disneyland Digital pictures,

Various ways to display multiple photographs,

Using ActiveX Controls with Windows Forms in Visual Studio .NET

PUBLIC ox as MyForm

ox=CREATEOBJECT("MyForm")

*Regsvr32 c:\WINDOWS\system32\msdxm.ocx

DEFINE CLASS MyForm as Form

          height=900

          width = 1124

          oEv=0 && Event handler ref

          allowoutput=.f.

          fLoaded=.f.

          ADD OBJECT oc AS OleControl with;

                   oleclass="AMOVIE.ActiveMovieControl.2"

          PROCEDURE init

                   cFilename="d:\slides.avi"

                   this.oc.width=thisform.Width

                   this.oc.height= thisform.Height

                   this.oc.filename=cFilename

                   this.oEv = CREATEOBJECT("evHandler",this)

                   EVENTHANDLER(this.oc.object,this.oEv)

                   IF thisform.Left < 0 or thisform.Left > SYSMETRIC(1)-100 && on 2nd monitor

                             thisform.oc.object.MovieWindowSize= 1

                   ELSE

                             thisform.oc.object.MovieWindowSize= 4 && amvOneHalfScreen

                   ENDIF

                   this.Show

                   DO WHILE !thisform.fLoaded

*!* DO WHILE this.oc.object.currentstate = -1

                             IF INKEY(.5)=27

                                      EXIT

                             ENDIF

                   ENDDO

                   thisform.oc.object.run

ENDDEFINE

DEFINE CLASS evHandler AS custom

          IMPLEMENTS DActiveMovieEvents2 IN "C:\WINDOWS\SYSTEM32\AMCOMPAT.TLB"

          oForm=null

          PROCEDURE init(oForm)

                   this.oForm=oForm

          PROCEDURE DActiveMovieEvents2_StateChange(oldState AS Number, newState AS Number) AS VOID;

  HELPSTRING "Indicates that the current state of the movie has changed"

          * add user code here

          ENDPROC

          PROCEDURE DActiveMovieEvents2_PositionChange(oldPosition AS Number, newPosition AS Number) AS VOID;

  HELPSTRING "Indicates that the current position of the movie has changed"

          * add user code here

          ENDPROC

          PROCEDURE DActiveMovieEvents2_Timer() AS VOID;

  HELPSTRING "ActiveMovie Control's progress timer"

          * add user code here

          ENDPROC

          PROCEDURE DActiveMovieEvents2_OpenComplete() AS VOID;

  HELPSTRING "Reports that an asynchronous operation to open a file has completed successfully"

                   ?PROGRAM()

                   this.oform.fLoaded=.t.

          ENDPROC

          PROCEDURE DActiveMovieEvents2_Click() AS VOID

          * add user code here

          ENDPROC

          PROCEDURE DActiveMovieEvents2_DblClick() AS VOID

          * add user code here

          ENDPROC

          PROCEDURE DActiveMovieEvents2_KeyDown(KeyCode AS INTEGER, Shift AS INTEGER) AS VOID

          * add user code here

          ENDPROC

          PROCEDURE DActiveMovieEvents2_KeyUp(KeyCode AS INTEGER, Shift AS INTEGER) AS VOID

          * add user code here

          ENDPROC

          PROCEDURE DActiveMovieEvents2_KeyPress(KeyAscii AS INTEGER) AS VOID

          * add user code here

          ENDPROC

          PROCEDURE DActiveMovieEvents2_MouseDown(Button AS INTEGER, Shift AS INTEGER, x AS Number, y AS Number) AS VOID

          * add user code here

          ENDPROC

          PROCEDURE DActiveMovieEvents2_MouseMove(Button AS INTEGER, Shift AS INTEGER, x AS Number, y AS Number) AS VOID

          * add user code here

          ENDPROC

          PROCEDURE DActiveMovieEvents2_MouseUp(Button AS INTEGER, Shift AS INTEGER, x AS Number, y AS Number) AS VOID

          * add user code here

          ENDPROC

          PROCEDURE DActiveMovieEvents2_Error(SCode AS INTEGER, Description AS STRING, Source AS STRING, CancelDisplay AS LOGICAL) AS VOID

          * add user code here

          ENDPROC

          PROCEDURE DActiveMovieEvents2_DisplayModeChange() AS VOID;

  HELPSTRING "Indicates that the display mode of the movie has changed"

          * add user code here

          ENDPROC

          PROCEDURE DActiveMovieEvents2_ReadyStateChange(ReadyState AS VARIANT) AS VOID;

  HELPSTRING "Reports that the ReadyState property of the ActiveMovie Control has changed"

          * add user code here

          ENDPROC

          PROCEDURE DActiveMovieEvents2_ScriptCommand(bstrType AS STRING, bstrText AS STRING) AS VOID

          * add user code here

          ENDPROC

ENDDEFINE

VB.Net sample here:

Public Class Form1

    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

        Me.Height = 900

        Me.Width = 1124

        Me.AxActiveMovie1.MovieWindowSize = AMovie.WindowSizeConstants.amvDoubleOriginalSize

        Me.AxActiveMovie1.FileName = "d:\slides.avi"

    End Sub

    Private Sub AxActiveMovie1_OpenComplete(ByVal sender As Object, ByVal e As System.EventArgs) Handles AxActiveMovie1.OpenComplete

        Me.AxActiveMovie1.Run()

    End Sub

End Class