| DirectX7: 
  DirectXEventBy: Jack Hoxley
 Written: June 2000
 
 DirectXEvent is used only in 
  DirectMusic, DirectSound, DirectInput and DirectPlay. It allows you (the programmer) 
  to recieve information from DirectX. A good example of this is in DirectSound. 
  When you can use the DirectXEvent to get DirectX to tell you when the sound 
  buffer has got to a certain point; and then you can act on it. You could think of it like this; 
  almost your entire program is you telling directX to do this, to do that - you're 
  talking to it; but apart from any return values it's not talking to you. Using 
  the directXEvent you can get it to talk back to you without you directly asking 
  it to; although you're setting it up to talk to you, it automatically talks 
  to you after this point - regardless of whether you just asked it to. DirectXEvent can only be used 
  in a form object; not in modules or classes. It uses this code: 
                                          
                                          
                                            
                                              
                                                | 
                                                    
                                                      
                                                        | 
                                                            
                                                              
                                                                | 
                                                                    
                                                                      
                                                                        | 'In the declarations 
          section:Implements DirectXEvent
 'This part will automatically 
          appear:Private Sub DirectXEvent_DXCallBack(ByVal eventid as Long)
 
 End Sub
 
 'You can then modify it like so:
 Private Sub DirectXEvent_DXCallBack(ByVal eventid as Long)
 select case eventid
 case 0 'Event 0 has happened
 'This code is executed when event 0 happens
 case 1 'Event 1 has happened
 'Event 1 code is here
 case 2 'Event 2 code is here
 'Do stuff for Event 2
 end select
 End Sub
 
 'Events Must be created before they can be used;
 Dim EventHandle as long
 EventHandle = dx.CreateEvent(Me) 'Creates a general 
          event
 EventHandle = dx.CreateEvent(0) 'Creates a specific 
          event - you can then use
 'the select case method above.
 
 'Events MUST be explicitely destroyed before you're 
          application terminates; otherwise
 'you'll get 'unexpected' results - ie. It'll crash :)
 If EventHandle <> 0 Then 'If the EventHandle value 
          is 0 there is no event there.
 dx.DestroyEvent EventHandle 'Destroy the event 
          represented by the value in the variable.
 end if
 'NB: destroying events can take several seconds; 
          bare this in mind when you're application
 'takes ten minutes to shut down :)
 |  |  |  |  DirectSound-Getting the current playback position in a normal buffer; or detecting when 
  the end of the sound has been reached.
 
                                          
                                          
                                            
                                              
                                                | 
                                                    
                                                      
                                                        | 
                                                            
                                                              
                                                                | 
                                                                    
                                                                      
                                                                        | 'The variables that 
          we need, Public EventID(1) As Long
 Public EVNT(1) As DSBPOSITIONNOTIFY
 
 'Create two Events
 EventID(0) = DX.CreateEvent(Me)
 EventID(1) = DX.CreateEvent(Me)
 
 'Set up the first event.
 EVNT(0).hEventNotify = EventID(0) 'This event 
          has this ID (0)
 EVNT(0).lOffset = 0 'Time from when the start 
          of the buffer
 'to when it is triggered. 0 would therefore mean it is triggered at 
          the start.
 
 'Set up the second event.
 EVNT(1).hEventNotify = EventID(1) 'This event 
          is represented by event 1
 EVNT(1).lOffset = DSBPN_OFFSETSTOP 'A simple constant. 
          This sets the event
 'To be raised when the buffer has finished playback (a natural finish) 
          or it was halted (by you - buffer.Stop)
 
 'The events have been created; but we now need 
          them to be linked to the sound buffer.
 Buffer.SetNotificationPositions 2, EVNT() 'the 
          2 specifies that there are 2 entries in the EVNT() member
 
 'Now we can put code behind these events.
 Private Sub DirectXEvent_DXCallback(ByVal EventID As Long)
 
 'Check which event was triggered...
 Select Case EventID
 case EVNT(0).hEventNotify
 msgbox "Event 0 occured: Sound should be playing"
 Case EVNT(1).hEventNotify
 msgbox "Event 1 occured: Sound should have just finished"
 End Select
 
 End Sub
 
 'REMEMBER TO DESTROY THE EVENTS - see above.
 |  |  |  |   DirectMusic 
  and DirectInput -When the music being played gets to a certain point.
 -Change in state of the 
  device: Joystick moved, mouse moved, buttons pressed etc...
 Both DirectMusic and DirectInput 
  can be handled in a similiar way: 
                                          
                                          
                                            
                                              
                                                | 
                                                    
                                                      
                                                        | 
                                                            
                                                              
                                                                | 
                                                                    
                                                                      
                                                                        | dim EventHandle as long Implements DirectXEvent
 
 EventHandle = Dx.CreateEvent(me)
 
 DiDev.SetEventNotification EventHandle 'For directinput
 '-Or-
 Perf.SetEventNotificationHandle EventHandle 
          'For DirectMusic
 'Because there is no special way of checking what 
          the status of these two are; you can just use
 'the fact that when the Event is triggered something has changed. In 
          the case of DirectInput; when
 'the event is triggered check the status of whichever device you are 
          using - as it has just changed
 'With DirectMusic; check the position of the performance.
 |  |  |  |  DirectPlay- When a lobby recieves a message.
 
 
                                          
                                          
                                            
                                              
                                                | 
                                                    
                                                      
                                                        | 
                                                            
                                                              
                                                                | 
                                                                    
                                                                      
                                                                        | dim EventHandle as long Implements DirectXEvent
 
 EventHandle=Dx.CreateEvent(me)
 
 Lobby.SetLobbyMessageEvent(0, EventHandle)
 'The first argument is the Application number. 
          The number is obtained from the "runApplication" method.
 'If you are only comunicating with one lobby client; this number must 
          be 0.
 
 'The event is raised when the lobby hosting the event recieves a message. 
          The EventHandle is used to create a
 'standard event to host this.
 |  |  |  |  |