home *** CD-ROM | disk | FTP | other *** search
/ Microsoft Multimedia Jumpstart 1.1a / CD_ROM.BIN / develpmt / source / hotspot / editor / file.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-11-03  |  10.3 KB  |  316 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.     file.c has:
  13.         FileOpen -- Prompts for AVI and HOT files; loads selected files.
  14.              Returns FALSE if didn't get an AVI file, Returns TRUE
  15.              even if didn't get a HOT file but got an AVI file.
  16.         FileSave -- saves a HOT file, optionally prompting for filename
  17.         
  18.  
  19. */
  20.                         
  21. #include <windows.h>
  22. #include <mmsystem.h>
  23. #include <digitalv.h>
  24. #include <viewer.h>
  25. #include <string.h>
  26. #include <commdlg.h>
  27. #include <stdlib.h>
  28.  
  29. #include "hotspot.h"
  30. #include "avihed.h"            /* specific to this program          */
  31. #include "avihede.h"            // extern vars
  32.  
  33. #include "mciavi.h"
  34. LONG FAR PASCAL _export ICAVIDrawProc(DWORD id, HDRVR hDriver,
  35.     UINT uiMessage, LPARAM lParam1, LPARAM lParam2);
  36.  
  37.  
  38. /*
  39.     FileOpen -- uses GetOpenFileName to prompt user for AVI and HOT
  40.         filenames.  Uses fileOpenMovie to load the AVI file, and
  41.         playMovie and setMovie and MCI_WHERE to get it into the window
  42.         and on the first frame.  Uses InitHotspots() to load
  43.         hotspot file.
  44. */
  45. BOOL FileOpen(HWND hWnd)
  46. {    
  47.     static OPENFILENAME ofn;
  48.     char szBuf[129];
  49.     char szFileName[MAXFILENAME] = "";
  50.     char szFileTitle[MAXFILENAME] = "";
  51.     char szFilterSpec [128] =                       /* file type filters */
  52.              "AVI Files (*.AVI)\0*.AVI\0All Files (*.*)\0*.*\0";
  53.     char szFilterSpec2 [128] = 
  54.             "Hotspot Files (*.HOT)\0*.HOT\0All Files (*.*)\0*.*\0";
  55.  
  56.     ofn.lStructSize       = sizeof(OPENFILENAME);
  57.     ofn.hwndOwner         = hWnd;
  58.     ofn.lpstrFilter       = szFilterSpec;
  59.     ofn.lpstrCustomFilter = NULL;
  60.     ofn.nMaxCustFilter    = 0;
  61.     ofn.nFilterIndex      = 1;
  62.     ofn.lpstrFile         = szFileName;
  63.     ofn.nMaxFile          = MAXFILENAME;
  64.     ofn.lpstrInitialDir   = NULL;
  65.     ofn.lpstrFileTitle    = szFileTitle;
  66.     ofn.nMaxFileTitle     = MAXFILENAME;
  67.     ofn.lpstrTitle        = "Open AVI File";
  68.     ofn.lpstrDefExt       = "AVI";
  69.     ofn.Flags             = 0;
  70.     
  71.     if (!GetOpenFileName ((LPOPENFILENAME)&ofn))
  72.             return FALSE;    
  73.     
  74.     if (pMovieInfo)                                     // get rid of old stuff if there is
  75.         {
  76.         fileCloseMovie(pMovieInfo, TRUE);
  77.         DeleteHotspotList(pMovieInfo);
  78.         FREE(pMovieInfo);
  79.         }
  80.             
  81.     lstrcpy(szWindowTitle, szBaseWindowTitle);
  82.                     lstrcat(szWindowTitle, " - ");
  83.                     lstrcat(szWindowTitle, szFileTitle);
  84.     
  85.     SetWindowText(hWnd, szWindowTitle);                
  86.     
  87.     {    // added SetProp to accomodate new drawproc
  88.         HANDLE hglb;
  89.         
  90.         hglb = GlobalAlloc(GHND,(DWORD)(sizeof(MOVIEINFO)));
  91.         if (hglb)
  92.         {
  93.             pMovieInfo = (PMOVIEINFO) GlobalLock(hglb);
  94.         }
  95.         else
  96.         {
  97.             pMovieInfo = NULL;
  98.         }
  99.         //pMovieInfo = (PMOVIEINFO) ((hglb = GlobalAlloc(GHND, (DWORD)(sizeof(MOVIEINFO)))) ? GlobalLock(hglb) : NULL);
  100.  
  101.         if (!pMovieInfo)
  102.             return (FALSE);
  103.  
  104.         pMovieInfo->hwndParent = hWnd;
  105.         lstrcpy(pMovieInfo->szAVIFileName, ofn.lpstrFile);
  106.  
  107.         fileOpenMovie(pMovieInfo, ofn.lpstrFile);    
  108.            SetProp(hWnd, (LPSTR) szMovieInfo,hglb);    
  109.         SetProp(pMovieInfo->hwndMovie, (LPSTR) szMovieInfo, hglb);
  110. { char a[256];wsprintf(a,"wnd1 %X wnd2 %X\n",hWnd,pMovieInfo->hwndMovie); OutputDebugString(a);}
  111.     }
  112.     //playMovie(pMovieInfo, 0);        // screws up drawproc for some reason
  113.     {
  114.         MCI_DGV_SETVIDEO_PARMS    dgv;
  115.         UINT                    uDevice;
  116.         dgv.dwValue = (DWORD) ICAVIDrawProc;
  117.             //MakeProcInstance((FARPROC) ICAVIDrawProc,hInstApp);
  118.         dgv.dwItem = MCI_AVI_SETVIDEO_DRAW_PROCEDURE;
  119.         uDevice = pMovieInfo->wMCIDeviceID;
  120.         if (uDevice)
  121.         {
  122.             DWORD dw;
  123.                                 
  124.             dw = mciSendCommand(uDevice,
  125.             MCI_SETVIDEO,
  126.             MCI_DGV_SETVIDEO_ITEM | MCI_DGV_SETVIDEO_VALUE,
  127.             (DWORD) (MCI_DGV_SETVIDEO_PARMS FAR *)&dgv);
  128.             OutputDebugString("set draw proc!\n");
  129.             if (dw != 0)
  130.             {
  131.                 MessageBox(GetFocus(),
  132.                     "The currently installed MCIAVI does not "
  133.                     "support the MCI_AVI_SETVIDEO_DRAW_PROCEDURE "
  134.                     "command during play.","MCI Problem",
  135.                     MB_OK | MB_ICONHAND);
  136.             }
  137.         }
  138.         else
  139.         {
  140.             MessageBox(GetFocus(),"movie info has no device id",
  141.                 "real bummer",MB_OK);
  142.         }
  143.     }    
  144.     setMovie(pMovieInfo, pMovieInfo->dwCurrentFrame, NULL);
  145.     {
  146.     RECT rcClient, rcWindow;      //rcMovieBounds, rc
  147.     MCI_DGV_RECT_PARMS   mciRect;
  148.     BOOL retcode = TRUE;
  149.     
  150.     /* if there is no movie yet then just get out of here */
  151.     GetClientRect(hWnd, &rcClient);  /* get the parent windows rect */
  152.     GetWindowRect(hWnd, &rcWindow);
  153.     mciSendCommand(pMovieInfo->wMCIDeviceID, MCI_WHERE,
  154.                   (DWORD)(MCI_DGV_WHERE_SOURCE),
  155.                   (DWORD)(LPMCI_DGV_RECT_PARMS)&mciRect);
  156.     
  157.     }
  158.     
  159.     pMovieInfo->fPlaying = FALSE;
  160.  
  161.     bFileLoaded = TRUE;
  162.     wsprintf(szBuf, "%ld of %ld", pMovieInfo->dwCurrentFrame,
  163.                     pMovieInfo->dwMovieLength);
  164.     SetDlgItemText(hwndDlg, ID_CURRENTFRAME, szBuf);
  165.     
  166.     // now try opening a HOT file
  167.     
  168.     memset(szFileName, 0, sizeof(szFileName));
  169.     memset(szFileTitle, 0, sizeof(szFileTitle));
  170.     memset(&ofn, 0, sizeof(OPENFILENAME));
  171.     
  172.     ofn.lStructSize       = sizeof(OPENFILENAME);
  173.     ofn.hwndOwner         = hWnd;
  174.     ofn.lpstrFilter       = szFilterSpec2;
  175.     ofn.lpstrCustomFilter = NULL;
  176.     ofn.nMaxCustFilter    = 0;
  177.     ofn.nFilterIndex      = 1;
  178.     ofn.lpstrFile         = szFileName;
  179.     ofn.nMaxFile          = MAXFILENAME;
  180.     ofn.lpstrInitialDir   = NULL;
  181.     ofn.lpstrFileTitle    = szFileTitle;
  182.     ofn.nMaxFileTitle     = MAXFILENAME;
  183.     ofn.lpstrTitle        = "Open Hotspot File";
  184.     ofn.lpstrDefExt       = "HOT";
  185.     ofn.Flags             = 0;
  186.     
  187.     if (!GetOpenFileName ((LPOPENFILENAME)&ofn))
  188.             return TRUE;
  189.     
  190.     lstrcpy(pMovieInfo->szIniFileName, ofn.lpstrFile);
  191.     InitHotspots(pMovieInfo, ofn.lpstrFile);
  192.     if (pMovieInfo->pHotspotList && pMovieInfo->hwndMovie)                    
  193.         {
  194.         HDC hDC;
  195.         
  196.         hDC = GetDC(pMovieInfo->hwndMovie);
  197.         DrawRects(hDC, pMovieInfo);            
  198.         ReleaseDC(pMovieInfo->hwndMovie, hDC);
  199.         }
  200.     return TRUE;
  201. }
  202.  
  203. /*
  204.     FileSave -- saves hotspot into file.  Uses GetSaveFileName to prompt
  205.         user for filename if the MOVIEINFO doesn't have a filename, or
  206.         if bGetFileName is set.
  207. */
  208. BOOL FileSave(HWND hWnd, BOOL bGetFileName)
  209. {
  210.     int hotcount;
  211.     HFILE hFile;
  212.     PHOTSPOT pHotspot;
  213.     static OPENFILENAME ofn;
  214.     static OFSTRUCT of;
  215.     char szFileTitle[MAXFILENAME] = "";
  216.     char szFileName[MAXFILENAME] = "";
  217.     char szFilterSpec [128] =                       /* file type filters */
  218.              "Hotspot Files (*.HOT)\0*.HOT\0All Files (*.*)\0*.*\0";
  219.     BOOL bGet = TRUE;
  220.  
  221.     if (pMovieInfo->szIniFileName)
  222.         {
  223.         if (lstrlen(pMovieInfo->szIniFileName))            
  224.             {
  225.             bGet = FALSE;            
  226.             lstrcpy(szFileName, pMovieInfo->szIniFileName);
  227.             }
  228.         }
  229.         
  230.     if (bGetFileName)
  231.         bGet = TRUE;
  232.     if (bGet)
  233.         {
  234.         ofn.lStructSize       = sizeof(OPENFILENAME);
  235.         ofn.hwndOwner     = hWnd;
  236.         ofn.lpstrFilter   = szFilterSpec;
  237.         ofn.lpstrCustomFilter = NULL;
  238.         ofn.nMaxCustFilter    = 0;
  239.         ofn.nFilterIndex      = 1;
  240.         ofn.lpstrFile         = pMovieInfo->szIniFileName;
  241.         ofn.nMaxFile          = MAXFILENAME;
  242.         ofn.lpstrInitialDir   = NULL;
  243.         ofn.lpstrFileTitle    = szFileTitle;
  244.         ofn.nMaxFileTitle     = MAXFILENAME;
  245.         ofn.lpstrTitle        = NULL;
  246.         ofn.lpstrDefExt       = "HOT";
  247.         ofn.Flags             = OFN_OVERWRITEPROMPT;
  248.     
  249.         if (!GetSaveFileName ((LPOPENFILENAME)&ofn))
  250.             {
  251.             DWORD dw;
  252.             dw = CommDlgExtendedError();
  253.             }
  254.         }    
  255.     hotcount = 0;
  256.     pHotspot = pMovieInfo->pHotspotList;
  257.     while (pHotspot)    // we'll save a hotspot count in the file to
  258.                         // make life easy for the load routine.
  259.         {
  260.         hotcount++;
  261.         pHotspot = pHotspot->pNext;
  262.         }
  263.  
  264.     pHotspot = pMovieInfo->pHotspotList;
  265.     
  266.     if (bGet)
  267.         {
  268.         lstrcpy(pMovieInfo->szIniFileName, ofn.lpstrFile);
  269.         lstrcpy(szFileName, ofn.lpstrFile);
  270.         }
  271.  
  272.     hFile = _lcreat(szFileName,0);
  273.     if (!hFile == HFILE_ERROR)
  274.     {
  275.         MessageBox(GetFocus(),szFileName,"Can't write this file:",MB_OK);
  276.     }
  277.     
  278.     _lwrite(hFile,"HH",2);
  279.     _lwrite(hFile,&hotcount,sizeof(hotcount));
  280.         
  281.     while (pHotspot)
  282.     {
  283.         int x;
  284.             
  285.         _lwrite(hFile,&pHotspot->rc.left,sizeof(pHotspot->rc.left));
  286.         _lwrite(hFile,&pHotspot->rc.top,sizeof(pHotspot->rc.top));
  287.         _lwrite(hFile,&pHotspot->rc.right,sizeof(pHotspot->rc.right));
  288.         _lwrite(hFile,&pHotspot->rc.bottom,sizeof(pHotspot->rc.bottom));
  289.         
  290.         x = pHotspot->pszHotspotID ? lstrlen(pHotspot->pszHotspotID) : 0;
  291.         _lwrite(hFile,&x,sizeof(x));
  292.         if (x && pHotspot->pszHotspotID) _lwrite(hFile,pHotspot->pszHotspotID,x);
  293.         
  294.         x = pHotspot->pszCommand ? lstrlen(pHotspot->pszCommand) : 0;
  295.         _lwrite(hFile,&x,sizeof(x));
  296.         if (x && pHotspot->pszCommand) _lwrite(hFile,pHotspot->pszCommand,x);
  297.  
  298.         _lwrite(hFile,&pHotspot->BeginFrame,sizeof(pHotspot->BeginFrame));
  299.         _lwrite(hFile,&pHotspot->EndFrame,sizeof(pHotspot->EndFrame));
  300.         _lwrite(hFile,&pHotspot->OnClick,sizeof(pHotspot->OnClick));
  301.         _lwrite(hFile,&pHotspot->ToFrame,sizeof(pHotspot->ToFrame));
  302.         pHotspot = pHotspot->pNext;            
  303.     }
  304.     _lclose(hFile);
  305.     bModified = FALSE;           
  306.     
  307.     lstrcpy(szWindowTitle, szBaseWindowTitle);
  308.     lstrcat(szWindowTitle, " - ");
  309.     lstrcat(szWindowTitle, szFileTitle);
  310.     SetWindowText(hWnd, szWindowTitle);
  311.     
  312.     return TRUE;
  313. }                
  314.                                   
  315.  
  316.