home *** CD-ROM | disk | FTP | other *** search
/ Microsoft Multimedia Jumpstart 1.1a / CD_ROM.BIN / develpmt / source / hotspot / vbx / main.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-11-03  |  8.6 KB  |  314 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.     main.c:
  13.         LibMain -- called by windows loader
  14.         FireAdjustSize -- fires a VB event when window is resized
  15.         FireHspClick -- fires a VB event telling app
  16.             which hotspot was clicked
  17.         FireAVIDone -- tells VB app that the AVI is done playing.
  18.         VBINITCC -- tells VB app our properties, events, and ctlproc
  19.         VBTERMCC -- called right before VBX is unloaded
  20.         AVICtlProc -- responds to messages such as setting properties
  21.             or mouse moves
  22. */
  23. #include <windows.h>
  24. #include <mmsystem.h>
  25. #include <digitalv.h>
  26. #include <string.h>
  27.  
  28. #include "hotspot.h"
  29. #include "avivbx.h"
  30.  
  31. // forward declars...
  32. void Terminate(PMOVIEINFO pMovieInfo);
  33. void InitMovieInfo();
  34. int GetFreeMovieInfo();
  35. void DestroyMovieInfo(int i);
  36. PMOVIEINFO PMovieInfoFromHCtl(HCTL hctl);
  37. static int cVbxUsers = 0;
  38. HANDLE hmodDLL;
  39. static BOOL bInit = FALSE;
  40. extern MOVIEINFO FAR MovieInfo[10];
  41.  
  42. // LibMain just grabs our module handle
  43. int FAR PASCAL LibMain
  44. (
  45.     HANDLE hModule,
  46.     WORD   wDataSeg,
  47.     WORD   cbHeapSize,
  48.     LPSTR  lpszCmdLine
  49. )
  50. {
  51.     wDataSeg    = wDataSeg;
  52.     cbHeapSize    = cbHeapSize;
  53.     lpszCmdLine = lpszCmdLine;
  54.     hmodDLL = hModule;
  55.     return TRUE;
  56. }
  57.  
  58. // Here we put the new size into a structure and give it to
  59. // VB with VBFireEvent.
  60. VOID NEAR FireAdjustSize(HCTL hctl, WORD cx, WORD cy)
  61. {
  62.     SIZEADJUSTPARAMS params;
  63.     
  64.     params.CX = &cx;
  65.     params.CY = &cy;
  66.     VBFireEvent(hctl, IEVENT_AVI_SIZEADJUST, ¶ms);
  67.     return;
  68. }
  69.  
  70. // We already know what hotspot was clicked, so we just pass its
  71. // ID (which is a string set by the user in the hotspot editor)
  72. // on to VB.  We have to call VB to create the string and destroy
  73. // the string (after we fire the event) because VB uses different
  74. // strings that we do.
  75. VOID NEAR FireHspClick(HCTL hctl, PHOTSPOT pHotspot)
  76. {
  77.     HSPCLICKPARAMS params;
  78.     
  79.     params.hlszHotspotID = VBCreateHlstr(pHotspot->pszHotspotID,
  80.         lstrlen(pHotspot->pszHotspotID));
  81.     VBFireEvent(hctl, IEVENT_AVI_HSPCLICK, ¶ms);
  82.     VBDestroyHlstr(params.hlszHotspotID);
  83.     return;
  84. }
  85.  
  86. // Just fire the event, no params...
  87. VOID NEAR FireAVIDone(HCTL hctl)
  88. {
  89.     AVIDONEPARAMS params;
  90.     
  91.     VBFireEvent(hctl,IEVENT_AVI_AVIDONE,¶ms);
  92.     return;
  93. }
  94.  
  95. // This is where we give VB our "Model" structure.  It tells VB all our
  96. // properties, events, and gives VB a pointer to our control proc.
  97. // We also call initAVI to open our AVI device.
  98. BOOL FAR PASCAL _export VBINITCC(USHORT usVersion, BOOL fRuntime)
  99. {
  100.     fRuntime  = fRuntime;
  101.     usVersion = usVersion;
  102.     ++cVbxUsers;
  103.     initAVI();
  104.     return VBRegisterModel(hmodDLL, &modelAvihot);
  105. }
  106.  
  107. // We call termAVI to close our AVI device.  We don't have to do
  108. // anything for VB.
  109. VOID FAR PASCAL _export VBTERMCC(VOID)
  110. {
  111.     --cVbxUsers;
  112.     termAVI();
  113.     return;
  114. }
  115.  
  116. // Here's our control proc.  It's just like a window proc, except VB
  117. // also sends us some messages starting with VBM_.  More comments by
  118. // each message.
  119. LONG FAR PASCAL _export AVICtlProc (
  120.     HCTL   hctl,
  121.     HWND   hwnd,
  122.     USHORT msg,
  123.     USHORT wp,
  124.     LONG   lp
  125. )
  126. {
  127.     PMOVIEINFO pMovieInfo;
  128.  
  129.     switch (msg)
  130.     {
  131.     // Adds us to an array of MOVIEINFOs maintained by this VBX.  We
  132.     // use PMovieInfoFromHCtl to get them back.
  133.     case WM_CREATE:
  134.         {
  135.             int i;
  136.             
  137.             i = GetFreeMovieInfo();
  138.             MovieInfo[i].bLoading = TRUE;
  139.             MovieInfo[i].hctl = hctl;
  140.             MovieInfo[i].bShowHot = FALSE;
  141.         }
  142.         break;
  143.     // If the picture is still, and gets invalidated, it won't be properly
  144.     // refreshed unless we tell MCI to MCI_UPDATE the window.
  145.     case WM_PAINT:
  146.         {
  147.             HDC hDC;
  148.             PAINTSTRUCT ps;
  149.             MCI_DGV_UPDATE_PARMS mciUpdate;
  150.             
  151.             hDC = BeginPaint(hwnd, &ps);
  152.             pMovieInfo = PMovieInfoFromHCtl(hctl);
  153.             if (pMovieInfo)
  154.             {
  155.                 mciUpdate.hDC = hDC;
  156.                 mciUpdate.rc = ps.rcPaint;
  157.                 mciUpdate.wReserved0 = 0;
  158.                 mciUpdate.dwCallback = NULL;
  159.                 mciSendCommand(pMovieInfo->wMCIDeviceID, MCI_UPDATE,
  160.                     MCI_WAIT | MCI_DGV_RECT | MCI_DGV_UPDATE_PAINT | MCI_DGV_UPDATE_HDC,
  161.                     (DWORD)(LPMCI_DGV_UPDATE_PARMS)&mciUpdate);
  162.             }
  163.             EndPaint(hwnd, &ps);
  164.         }
  165.         return TRUE;
  166.     // Button down!  Could mean a hotspot was clicked!
  167.     case WM_LBUTTONDOWN:
  168.         pMovieInfo = PMovieInfoFromHCtl(hctl);
  169.         if (0 == (OnButtonDown(pMovieInfo, msg, wp, lp)))
  170.         {
  171.             Terminate(pMovieInfo);
  172.             return 0L;
  173.         }
  174.         break;
  175.     // Oh, it's over!  Let's close it and tell VB.
  176.     case MM_MCINOTIFY:
  177.         switch(wp)
  178.         {
  179.         case MCI_NOTIFY_SUCCESSFUL:
  180.             {
  181.                 pMovieInfo = PMovieInfoFromHCtl(hctl);
  182.                 pMovieInfo->fPlaying = FALSE;
  183.                 Terminate(pMovieInfo);
  184.                 VBInvalidateRect(hctl, NULL, TRUE);
  185.                 VBUpdateControl(hctl);
  186.                 FireAVIDone(hctl);
  187.                 return 0L;
  188.             }
  189.         }
  190.         break;
  191.     // we're gone -- close up shop and nuke the hotspot list.
  192.     case WM_DESTROY:
  193.         {
  194.             pMovieInfo = PMovieInfoFromHCtl(hctl);
  195.             if (pMovieInfo)
  196.             {
  197.                 Terminate(pMovieInfo);
  198.                 DeleteHotspotList(pMovieInfo);
  199.                 pMovieInfo->hctl = NULL;
  200.             }
  201.             if (pCtlInfoDEREF(hctl)->hszAVIFile)
  202.                 VBDestroyHsz(pCtlInfoDEREF(hctl)->hszAVIFile);
  203.             if (pCtlInfoDEREF(hctl)->hszHotFile)
  204.                 VBDestroyHsz(pCtlInfoDEREF(hctl)->hszHotFile);
  205.         }
  206.         break;
  207.     // this does nothing.
  208.     case VBM_INITIALIZE:
  209.         break;
  210.     // We're loaded, lets remember our handle.
  211.     case VBM_LOADED:
  212.         {
  213.             pMovieInfo = PMovieInfoFromHCtl(hctl);
  214.             pMovieInfo->bLoading = FALSE;
  215.         }
  216.         break;
  217.     // Here's where all the work is done...
  218.     case VBM_SETPROPERTY:
  219.         // get our instance info
  220.         pMovieInfo = PMovieInfoFromHCtl(hctl);
  221.         if (pMovieInfo)
  222.         {
  223.             pCtlInfoDEREF(hctl)->lLength = (LONG) GetMovieLength(pMovieInfo);
  224.             pCtlInfoDEREF(hctl)->lFrame = (LONG) GetMovieFrame(pMovieInfo);
  225.         }
  226.         switch (wp)
  227.         {
  228.         // AVIFile set, let's load the file and resize the window to its
  229.         // coordinates.  To do that, we pass its coordinates, converted
  230.         // from twips, to fileOpenMovie.  We also delete the previous
  231.         // hotspot list so hotspots don't accumulate.
  232.         case IPROP_AVI_AVIFILE:
  233.             {
  234.                 LPSTR lpstr = VBDerefHsz(pCtlInfoDEREF(hctl)->hszAVIFile);
  235.                 if (lpstr && lstrlen(lpstr))
  236.                 {
  237.                     float xtwips, ytwips;
  238.                     SHORT xpxls, ypxls;
  239.                     
  240.                     lstrcpy(pMovieInfo->szAVIFileName, lpstr);
  241.                     pMovieInfo->hwndParent = hwnd;
  242.                     VBGetControlProperty(hctl,(USHORT) IPROP_AVI_LEFT,&xtwips);
  243.                     VBGetControlProperty(hctl,(USHORT) IPROP_AVI_TOP,&ytwips);
  244.                     xpxls = VBXTwipsToPixels((LONG)xtwips);
  245.                     ypxls = VBYTwipsToPixels((LONG)ytwips);
  246.                     DeleteHotspotList(pMovieInfo);
  247.                     fileOpenMovie(pMovieInfo, pMovieInfo->szAVIFileName,xpxls,ypxls);
  248.                 }
  249.             }
  250.             break;
  251.         // HOTFile was set, let's load in a hotspot list.
  252.         case IPROP_AVI_HOTFILE:
  253.             {
  254.                 LPSTR lpstr = VBDerefHsz(pCtlInfoDEREF(hctl)->hszHotFile);
  255.                 
  256.                 pMovieInfo = PMovieInfoFromHCtl(hctl);
  257.                 if (lpstr && lstrlen(lpstr))
  258.                 {
  259.                     lstrcpy(pMovieInfo->szHotFileName, lpstr);
  260.                     InitHotspots(pMovieInfo, pMovieInfo->szHotFileName);
  261.                 }
  262.             }
  263.             break;
  264.         // Play was set.  The play property can play (==1), pause (==0)
  265.         // or play in reverse (==2) the video.  Later we added close (==3)
  266.         // because this was the simplest way to do it...  So we call
  267.         // Terminate to close, and playMovie for everything else.
  268.         case IPROP_AVI_PLAY:
  269.             {
  270.                 WORD wPlay;
  271.                 
  272.                 wPlay = (WORD) pCtlInfoDEREF(hctl)->fPlay;
  273.                 if (wPlay > 2)
  274.                 {
  275.                     Terminate(pMovieInfo);
  276.                     VBInvalidateRect(hctl, NULL, TRUE);
  277.                     VBUpdateControl(hctl);
  278.                 }
  279.                 else
  280.                 {
  281.                     pMovieInfo = PMovieInfoFromHCtl(hctl);
  282.                     playMovie(pMovieInfo, wPlay);
  283.                 }
  284.             }
  285.             break;
  286.         // Frame property set -- that means we should seek to that frame!
  287.         // we get the new number, and call setMovie.
  288.         case IPROP_AVI_FRAME:
  289.             {
  290.                 LONG lFrame;
  291.                 
  292.                 lFrame = pCtlInfoDEREF(hctl)->lFrame;
  293.                 pMovieInfo = PMovieInfoFromHCtl(hctl);
  294.                 if (pMovieInfo) if (pMovieInfo->fMovieOpen)
  295.                 {
  296.                     setMovie(pMovieInfo, (DWORD) lp,NULL);
  297.                 }
  298.             }
  299.             break;
  300.         // Showhot property changed -- change the flag in the MovieInfo
  301.         // structure that tells the custom drawproc whether to draw the
  302.         // hotspots or not.
  303.         case IPROP_AVI_SHOWHOT:
  304.             {
  305.                 pMovieInfo = PMovieInfoFromHCtl(hctl);
  306.                 pMovieInfo->bShowHot = pCtlInfoDEREF(hctl)->nShowHot;
  307.             }
  308.             break;
  309.         }
  310.         break;
  311.     }
  312.     return VBDefControlProc(hctl, hwnd, msg, wp, lp);
  313. }
  314.