home *** CD-ROM | disk | FTP | other *** search
/ Microsoft Multimedia Jumpstart 1.1a / CD_ROM.BIN / develpmt / source / hotspot / vbx / sbcls.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-11-03  |  4.4 KB  |  189 lines

  1. /**************************************************************************
  2.  *
  3.  *  THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
  4.  *  KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
  5.  *  IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR
  6.  *  PURPOSE.
  7.  *
  8.  *  Copyright (c) 1993  Microsoft Corporation.  All Rights Reserved.
  9.  * 
  10.  **************************************************************************/
  11. /*
  12.     subcls.c:
  13.         
  14.         InitMovieInfo, GetFreeMovieInfo, DestroyMovieInfo,
  15.             PMovieInfoFromHCtl -- maintain list of MovieInfos
  16.         Terminate -- stops playing the movie and closes it
  17.         OnButtonDown -- if clicked point on a hotspot,
  18.             a viewer command is executed
  19.         CleanupStuff -- removes properties from windows before they
  20.             are destroyed
  21. */
  22. #include <windows.h>
  23. #include <mmsystem.h>
  24. #include <digitalv.h>
  25. #include <string.h>
  26.  
  27. #ifndef VB_VERSION
  28.   #include <vbapi.h>
  29. #endif
  30.  
  31. #include "hotspot.h"
  32.  
  33. VOID NEAR FireHspClick(HCTL hctl, PHOTSPOT pHotspot);
  34. extern char szMovieInfo[];
  35. MOVIEINFO FAR MovieInfo[10];
  36. static BOOL bInit = FALSE;
  37.  
  38. // these 4 functions are for keeping an array of MovieInfos
  39. // This one inits it...
  40. void InitMovieInfo()
  41. {
  42.     int i;
  43.     for (i = 0; i < 10; i++)
  44.     MovieInfo[i].hctl = NULL;
  45. }
  46.  
  47. // ...this one finds a place to add a new one...
  48. int GetFreeMovieInfo()
  49. {
  50.     static int i = 0;
  51.     while (MovieInfo[i].hctl != NULL && i < 10)
  52.     {
  53.         i++;
  54.     }
  55.     return (i);
  56. }
  57.  
  58. // ...and this one removes one...
  59. void DestroyMovieInfo(int i)
  60. {
  61.     MovieInfo[i].hctl = NULL;
  62. }
  63.  
  64. HANDLE hmodDLL;
  65.  
  66. // ... and this one gets the movieinfo that goes with this control.
  67. PMOVIEINFO PMovieInfoFromHCtl(HCTL hctl)
  68. {
  69.     int i = 0;
  70.     while (MovieInfo[i].hctl != hctl && i < 10)
  71.         ++i;
  72.     if (i == 10)
  73.         return (NULL);
  74.     else
  75.         return (&MovieInfo[i]);
  76. }
  77.  
  78. /*
  79.     Terminate -- pauses movie, then closes it with fileCloseMovie
  80. */ 
  81. void Terminate(PMOVIEINFO pMovieInfo)
  82. {
  83.     playMovie(pMovieInfo, 0);
  84.     fileCloseMovie(pMovieInfo, FALSE);
  85. }
  86.  
  87. /*
  88.     OnButtonDown -- walks through hotspot list.  For each hotspot,
  89.         uses PtInRect to see if its in the rect.  If it is, it uses
  90.         VwrCommand to transmit the hotspot's command to viewer.  Then
  91.         it looks at the Stop/Continue/Jump to setting and uses the return
  92.         value to handle Stop and Continue, or calls setMovie to do a
  93.         jump.
  94. */ 
  95. BOOL OnButtonDown(PMOVIEINFO pMovieInfo, USHORT msg, USHORT wp, LONG lp)
  96. {
  97.     PHOTSPOT pHotspot;
  98.     DWORD dwFrame;
  99.     POINT pt;
  100.  
  101.     if (!pMovieInfo)
  102.         return FALSE;
  103.     pHotspot = pMovieInfo->pHotspotList;
  104.     pt = MAKEPOINT(lp);
  105.     dwFrame = GetMovieFrame(pMovieInfo);
  106.     while (pHotspot)
  107.     {
  108.         if (dwFrame >= pHotspot->BeginFrame && dwFrame <= pHotspot->EndFrame)
  109.         {
  110.             if (PtInRect(&pHotspot->rc, pt) != 0)
  111.             {
  112.                 FireHspClick(pMovieInfo->hctl, pHotspot);
  113.                 switch (pHotspot->OnClick)
  114.                 {
  115.                 case ID_CONTINUE:
  116.                     return (TRUE);
  117.                 case ID_STOP:
  118.                     return (FALSE);
  119.                 case ID_JUMP:
  120.                     setMovie(pMovieInfo, pHotspot->ToFrame, NULL);
  121.                     pMovieInfo->dwCurrentFrame = pHotspot->ToFrame;
  122.                     pMovieInfo->fPlaying = FALSE;
  123.                     playMovie(pMovieInfo, 1);
  124.                     return (TRUE);
  125.                     default:
  126.                     return (TRUE);
  127.                 }
  128.             }
  129.         }
  130.         pHotspot = pHotspot->pNext;
  131.     }
  132.     return (TRUE);
  133. }
  134.  
  135. /*
  136.     CleanupStuff -- Removes properties and hotspots from windows in
  137.         movieinfo structure.  Frees the handle to the movieinfo, too!
  138. */
  139. LONG FAR PASCAL _export SbClsProc (HWND hwnd, USHORT msg,
  140.     USHORT wp, LONG lp)
  141. {
  142.     HANDLE hglb;
  143.     PMOVIEINFO pMovieInfo;
  144.     LRESULT lr;
  145.     hglb = GetProp(hwnd, (LPSTR)szMovieInfo);
  146.     pMovieInfo = (PMOVIEINFO)GlobalLock(hglb);
  147.     switch (msg)
  148.     {
  149.     case WM_LBUTTONDOWN:
  150.         if (0 == (OnButtonDown(pMovieInfo, msg, wp, lp)))
  151.         {
  152.             Terminate(pMovieInfo);
  153.             return 0L;
  154.         }
  155.         break;
  156.     case MM_MCINOTIFY:
  157.         switch(wp)
  158.         {
  159.         case MCI_NOTIFY_SUCCESSFUL:
  160.             pMovieInfo->fPlaying = FALSE;
  161.             Terminate(pMovieInfo);
  162.             return 0L;
  163.         }
  164.         break;
  165.     case WM_DESTROY:
  166.         lr = CallWindowProc(pMovieInfo->lpfnOldProc, hwnd, msg, wp, lp);
  167.         RemoveProp(hwnd, (LPSTR)szMovieInfo);
  168.         if (pMovieInfo)
  169.             DeleteHotspotList(pMovieInfo);
  170.         if (pMovieInfo)
  171.             SetWindowLong (hwnd, GWL_WNDPROC,
  172.             (LONG) pMovieInfo->lpfnOldProc);
  173.         GlobalUnlock(hglb);
  174.         GlobalFree(hglb);
  175.         hglb = NULL;
  176.         pMovieInfo = NULL;
  177.         break;
  178.     }
  179.     if (pMovieInfo)
  180.     {
  181.         lr = CallWindowProc(pMovieInfo->lpfnOldProc, hwnd, msg, wp, lp);
  182.         if (hglb)
  183.             GlobalUnlock(hglb);
  184.         return (lr);
  185.     }
  186.     else
  187.         return 0L;
  188. }
  189.