/* hspPlayAVI -- allocates a movieinfo structure, stores the window handle you gave it in the hwndParent entry in the movieinfo, and stores the callback you provide in the movieinfo -- these will be used by the subclassproc. It next calls InitHotspots to get a hotspot list, and fileOpenMovie which will open the AVI file and create a child window (a child of the window that you pass in to this function). The window is returned in the movieinfo. It then subclasses the window fileOpenMovie made, by changing the pointer to its WindowProc to ours (via SetWindowLong). It uses SetProp to hook this movieinfo up to both windows. The subclassed wndproc will get the movieinfo from the child window when a button is clicked, and the parent windowproc will get the movieinfo from the parent when Viewer wants to know the pane size. Finally, playMovie is called to start the movie. */ LONG CALLBACK __export hspPlayAVI(HWND hwnd, LPSTR szAVIFile, LPSTR szIniFile, FARPROC lpfnhspAVICallback) { HGLOBAL hglb; PMOVIEINFO pMovieInfo; hglb = GlobalAlloc(GHND, sizeof(MOVIEINFO)); pMovieInfo = (PMOVIEINFO)GlobalLock(hglb); if (!pMovieInfo) return (0L); pMovieInfo->hwndParent = hwnd; pMovieInfo->lpfnhspAVICallback = lpfnhspAVICallback; if (!hwnd) { Message("Invalid window specified for playing AVI file."); return 0L; } InitHotspots(pMovieInfo, szIniFile); OutputDebugString("calling fileOpenMovie\n"); fileOpenMovie(pMovieInfo, szAVIFile); GlobalUnlock(hglb); pMovieInfo->lpfnOldProc = (FARPROC) GetWindowLong (pMovieInfo->hwndMovie, GWL_WNDPROC); SetWindowLong (pMovieInfo->hwndMovie, GWL_WNDPROC, (LONG) SbClsProc); SetProp(pMovieInfo->hwndMovie, (LPSTR) szMovieInfo, hglb); SetProp(hwnd, (LPSTR) szMovieInfo, hglb); OutputDebugString("calling positionMovie\n"); positionMovie(pMovieInfo); OutputDebugString("calling playMovie\n"); { MCI_DGV_SETVIDEO_PARMS dgv; UINT uDevice; dgv.dwValue = (DWORD) ICAVIDrawProc; //MakeProcInstance((FARPROC) ICAVIDrawProc,hInstApp); dgv.dwItem = MCI_AVI_SETVIDEO_DRAW_PROCEDURE; uDevice = pMovieInfo->wMCIDeviceID; if (uDevice) { DWORD dw; dw = mciSendCommand(uDevice, MCI_SETVIDEO, MCI_DGV_SETVIDEO_ITEM | MCI_DGV_SETVIDEO_VALUE, (DWORD) (MCI_DGV_SETVIDEO_PARMS FAR *)&dgv); OutputDebugString("set draw proc!\n"); if (dw != 0) { MessageBox(GetFocus(), "The currently installed MCIAVI does not " "support the MCI_AVI_SETVIDEO_DRAW_PROCEDURE " "command during play.","MCI Problem", MB_OK | MB_ICONHAND); } } else { MessageBox(GetFocus(),"movie info has no device id", "real bummer",MB_OK); } playMovie(pMovieInfo, 1); } return (0L); }
/* FileOpen -- uses GetOpenFileName to prompt user for AVI and HOT filenames. Uses fileOpenMovie to load the AVI file, and playMovie and setMovie and MCI_WHERE to get it into the window and on the first frame. Uses InitHotspots() to load hotspot file. */ BOOL FileOpen(HWND hWnd) { static OPENFILENAME ofn; char szBuf[129]; char szFileName[MAXFILENAME] = ""; char szFileTitle[MAXFILENAME] = ""; char szFilterSpec [128] = /* file type filters */ "AVI Files (*.AVI)\0*.AVI\0All Files (*.*)\0*.*\0"; char szFilterSpec2 [128] = "Hotspot Files (*.HOT)\0*.HOT\0All Files (*.*)\0*.*\0"; ofn.lStructSize = sizeof(OPENFILENAME); ofn.hwndOwner = hWnd; ofn.lpstrFilter = szFilterSpec; ofn.lpstrCustomFilter = NULL; ofn.nMaxCustFilter = 0; ofn.nFilterIndex = 1; ofn.lpstrFile = szFileName; ofn.nMaxFile = MAXFILENAME; ofn.lpstrInitialDir = NULL; ofn.lpstrFileTitle = szFileTitle; ofn.nMaxFileTitle = MAXFILENAME; ofn.lpstrTitle = "Open AVI File"; ofn.lpstrDefExt = "AVI"; ofn.Flags = 0; if (!GetOpenFileName ((LPOPENFILENAME)&ofn)) return FALSE; if (pMovieInfo) // get rid of old stuff if there is { fileCloseMovie(pMovieInfo, TRUE); DeleteHotspotList(pMovieInfo); FREE(pMovieInfo); } lstrcpy(szWindowTitle, szBaseWindowTitle); lstrcat(szWindowTitle, " - "); lstrcat(szWindowTitle, szFileTitle); SetWindowText(hWnd, szWindowTitle); { // added SetProp to accomodate new drawproc HANDLE hglb; hglb = GlobalAlloc(GHND,(DWORD)(sizeof(MOVIEINFO))); if (hglb) { pMovieInfo = (PMOVIEINFO) GlobalLock(hglb); } else { pMovieInfo = NULL; } //pMovieInfo = (PMOVIEINFO) ((hglb = GlobalAlloc(GHND, (DWORD)(sizeof(MOVIEINFO)))) ? GlobalLock(hglb) : NULL); if (!pMovieInfo) return (FALSE); pMovieInfo->hwndParent = hWnd; lstrcpy(pMovieInfo->szAVIFileName, ofn.lpstrFile); fileOpenMovie(pMovieInfo, ofn.lpstrFile); SetProp(hWnd, (LPSTR) szMovieInfo,hglb); SetProp(pMovieInfo->hwndMovie, (LPSTR) szMovieInfo, hglb); { char a[256];wsprintf(a,"wnd1 %X wnd2 %X\n",hWnd,pMovieInfo->hwndMovie); OutputDebugString(a);} } //playMovie(pMovieInfo, 0); // screws up drawproc for some reason { MCI_DGV_SETVIDEO_PARMS dgv; UINT uDevice; dgv.dwValue = (DWORD) ICAVIDrawProc; //MakeProcInstance((FARPROC) ICAVIDrawProc,hInstApp); dgv.dwItem = MCI_AVI_SETVIDEO_DRAW_PROCEDURE; uDevice = pMovieInfo->wMCIDeviceID; if (uDevice) { DWORD dw; dw = mciSendCommand(uDevice, MCI_SETVIDEO, MCI_DGV_SETVIDEO_ITEM | MCI_DGV_SETVIDEO_VALUE, (DWORD) (MCI_DGV_SETVIDEO_PARMS FAR *)&dgv); OutputDebugString("set draw proc!\n"); if (dw != 0) { MessageBox(GetFocus(), "The currently installed MCIAVI does not " "support the MCI_AVI_SETVIDEO_DRAW_PROCEDURE " "command during play.","MCI Problem", MB_OK | MB_ICONHAND); } } else { MessageBox(GetFocus(),"movie info has no device id", "real bummer",MB_OK); } } setMovie(pMovieInfo, pMovieInfo->dwCurrentFrame, NULL); { RECT rcClient, rcWindow; //rcMovieBounds, rc MCI_DGV_RECT_PARMS mciRect; BOOL retcode = TRUE; /* if there is no movie yet then just get out of here */ GetClientRect(hWnd, &rcClient); /* get the parent windows rect */ GetWindowRect(hWnd, &rcWindow); mciSendCommand(pMovieInfo->wMCIDeviceID, MCI_WHERE, (DWORD)(MCI_DGV_WHERE_SOURCE), (DWORD)(LPMCI_DGV_RECT_PARMS)&mciRect); } pMovieInfo->fPlaying = FALSE; bFileLoaded = TRUE; wsprintf(szBuf, "%ld of %ld", pMovieInfo->dwCurrentFrame, pMovieInfo->dwMovieLength); SetDlgItemText(hwndDlg, ID_CURRENTFRAME, szBuf); // now try opening a HOT file memset(szFileName, 0, sizeof(szFileName)); memset(szFileTitle, 0, sizeof(szFileTitle)); memset(&ofn, 0, sizeof(OPENFILENAME)); ofn.lStructSize = sizeof(OPENFILENAME); ofn.hwndOwner = hWnd; ofn.lpstrFilter = szFilterSpec2; ofn.lpstrCustomFilter = NULL; ofn.nMaxCustFilter = 0; ofn.nFilterIndex = 1; ofn.lpstrFile = szFileName; ofn.nMaxFile = MAXFILENAME; ofn.lpstrInitialDir = NULL; ofn.lpstrFileTitle = szFileTitle; ofn.nMaxFileTitle = MAXFILENAME; ofn.lpstrTitle = "Open Hotspot File"; ofn.lpstrDefExt = "HOT"; ofn.Flags = 0; if (!GetOpenFileName ((LPOPENFILENAME)&ofn)) return TRUE; lstrcpy(pMovieInfo->szIniFileName, ofn.lpstrFile); InitHotspots(pMovieInfo, ofn.lpstrFile); if (pMovieInfo->pHotspotList && pMovieInfo->hwndMovie) { HDC hDC; hDC = GetDC(pMovieInfo->hwndMovie); DrawRects(hDC, pMovieInfo); ReleaseDC(pMovieInfo->hwndMovie, hDC); } return TRUE; }