/* ============================================================================== Program: AWMCISAM Purpose: Sample program that utilizies the Gold Disk MCI Animation Driver. Note: Gold Disk does not warrant, guarantee or make any representations regarding the use of, or the results of the use of the Sample MCI application in terms of correctness, accuracy, reliability, currentness, or otherwise; and you rely on the Sample MCI application and results solely at your own risk. ============================================================================== */ #include "awmcisam.h" #include "mciawi_x.h" VOID msDisplayMCIError (DWORD); VOID msSetControlsState (HWND, BOOL); BOOL msIsMoviePlaying (VOID); VOID msFillWindowColor (HWND, int); VOID msSetDlgItemCaps (HWND,DWORD, WORD); // If flag is TRUE we load with the NOTIFY flag // otherwise we use the WAIT flag static BOOL bBackgroundLoad; // If flag is TRUE we play into the driver's default screen otherwise // we play into the static window within the main dialog static BOOL bFullScreen; // This is the main instance handle for the app static HANDLE hMainInstance; // This holds the device Id of a open MCI element static WORD wDeviceID = -1; // main dialog static HWND hdlgMain; /***************************************************************************** Function: WinMain () *****************************************************************************/ int PASCAL WinMain ( HANDLE hInstance, // current instance HANDLE hPrevInstance, // previous instance LPSTR lpCmdLine, // command line int nCmdShow) // show-window type (open/icon) { MSG msg; FARPROC lpfnMainDlgProc; // Pointer for the Main Dialog Box hMainInstance = hInstance; lpfnMainDlgProc = MakeProcInstance (msMainDlgProc, hMainInstance); return DialogBox (hMainInstance, IDDLG_MAIN, NULL, lpfnMainDlgProc); } /***************************************************************************** Function: MainWndProc () - windows callable Desc: Main hidden window; parent of main dialog box. *****************************************************************************/ LONG FAR PASCAL MainWndProc ( HWND hwnd, unsigned message, WORD wParam, LONG lParam) { switch (message) { default: return (DefWindowProc(hwnd, message, wParam, lParam)); } return (NULL); } /****************************************************************************** Function: msMainDlgProc () - windows callable Desc: Dialog procedure for the 'Main' dialog box. Returns: BOOL TRUE FALSE ******************************************************************************/ BOOL FAR PASCAL msMainDlgProc ( HWND hdlg, unsigned message, WORD wParam, LONG lParam) { // MCI structure that is needed when playing a movie MCI_ANIM_PLAY_PARMS mciAnimPlayParms; // MCI structure that is needed when stepping in a movie MCI_ANIM_STEP_PARMS mciAnimStepParms; // MCI structure that is needed when changing the window of a movie MCI_ANIM_WINDOW_PARMS mciAnimWindowParms; // MCI structure that is needed when seeking within a movie MCI_SEEK_PARMS mciSeekParms; FARPROC lpfnOpenDlgProc; // Pointer for the Open Dialog Box FARPROC lpfnSeekDlgProc; // Pointer for the Seek Dialog Box FARPROC lpfnDevCapsDlgProc; // Pointer for the Device Caps Dialog Box FARPROC lpfnInfoDlgProc; // Pointer for the Info Dialog Box FARPROC lpfnStatusDlgProc; // Pointer for the Status Dialog Box FARPROC lpfnAboutDlgProc; // Pointer for the About Dialog Box DWORD dwError; RECT rc; HMENU hSysMenu; // Handle to the system menu char szAbout[msMAX]; PAINTSTRUCT ps; POINT ptTopLeft; POINT ptBottomRight; switch (message) { case WM_INITDIALOG: hdlgMain = hdlg; // adds a About option to the system menu hSysMenu = GetSystemMenu (hdlg,0); AppendMenu (hSysMenu, MF_SEPARATOR, 0, NULL); LoadString (hMainInstance,IDS_ABOUT, szAbout, sizeof(szAbout)-1); AppendMenu (hSysMenu, MF_STRING, IDM_ABOUT, szAbout); // sets up the icon for the application SetClassWord (hdlg, GCW_HICON, LoadIcon (hMainInstance, IDI_APPICON)); // Init values to defaults // bFullScreen = FALSE; CheckDlgButton (hdlg, IDCB_MAIN_FULL_SCRN, bFullScreen); bBackgroundLoad = FALSE; CheckDlgButton (hdlg, IDCB_MAIN_BKGND_LOAD, bBackgroundLoad); // disable all the controls msSetControlsState (hdlg, FALSE); return(TRUE); break; case WM_CTLCOLOR: if (bFullScreen) { if (GetDlgItem (hdlg, IDST_MAIN_PLAYWND) == LOWORD (lParam) ) { msFillWindowColor (GetDlgItem (hdlg, IDST_MAIN_PLAYWND), GRAY_BRUSH); } } break; case WM_SYSCOMMAND: switch (wParam) { case IDM_ABOUT: lpfnAboutDlgProc = MakeProcInstance (msAboutDlgProc, hMainInstance); DialogBox (hMainInstance, IDDLG_ABOUT, hdlg, lpfnAboutDlgProc); break; default: break; } break; case MM_MCINOTIFY: if (wParam == MCI_NOTIFY_SUCCESSFUL) { // set focus back to the main dialog SetFocus (hdlgMain); msSetControlsState (hdlg, TRUE); // ungrey all the controls // set up the window that the movie is to be played in if (bFullScreen) { mciAnimWindowParms.hWnd = MCI_ANIM_WINDOW_DEFAULT; dwError = mciSendCommand (wDeviceID, MCI_WINDOW, MCI_ANIM_WINDOW_HWND, (DWORD) (LPVOID) &mciAnimWindowParms); } else { mciAnimWindowParms.hWnd = GetDlgItem (hdlg, IDST_MAIN_PLAYWND); dwError = mciSendCommand (wDeviceID, MCI_WINDOW, MCI_ANIM_WINDOW_HWND, (DWORD) (LPVOID) &mciAnimWindowParms); } // show the movie dwError = mciSendCommand (wDeviceID, MCI_SEEK, MCI_WAIT | MCI_SEEK_TO_START, (DWORD) (LPVOID) &mciAnimPlayParms); if (!dwError) { dwError = mciSendCommand (wDeviceID, MCI_STOP, MCI_WAIT, (DWORD) (LPVOID) &mciAnimPlayParms); } if (dwError) { msDisplayMCIError (dwError); } // set focus back to the main dialog SetFocus (hdlgMain); } else { dwError = mciSendCommand (wDeviceID, MCI_CLOSE, MCI_WAIT, (DWORD) (LPVOID) &mciAnimPlayParms); msSetControlsState (hdlg, FALSE); // grey all the controls } break; case WM_COMMAND: switch (wParam) { case IDPB_MAIN_TOSTART: dwError = mciSendCommand (wDeviceID, MCI_SEEK, MCI_WAIT | MCI_SEEK_TO_START, (DWORD) (LPVOID) &mciSeekParms); if (dwError) { msDisplayMCIError (dwError); } break; case IDPB_MAIN_TOEND: dwError = mciSendCommand (wDeviceID, MCI_SEEK, MCI_WAIT | MCI_SEEK_TO_END, (DWORD) (LPVOID) &mciSeekParms); if (dwError) { msDisplayMCIError (dwError); } break; case IDPB_MAIN_DEV_CAP: if (wDeviceID != -1) { // if the movie is playing then stop it if (msIsMoviePlaying) { dwError = mciSendCommand (wDeviceID, MCI_STOP, MCI_WAIT, (DWORD) (LPVOID) &mciAnimPlayParms); if (dwError) { msDisplayMCIError (dwError); break; } } lpfnDevCapsDlgProc = MakeProcInstance (msDevCapsDlgProc, hMainInstance); DialogBox (hMainInstance, IDDLG_DEVCAPS, hdlg, lpfnDevCapsDlgProc); } break; case IDPB_MAIN_STATUS: if (wDeviceID != -1) { // if the movie is playing then stop it if (msIsMoviePlaying) { dwError = mciSendCommand (wDeviceID, MCI_STOP, MCI_WAIT, (DWORD) (LPVOID) &mciAnimPlayParms); if (dwError) { msDisplayMCIError (dwError); break; } } lpfnStatusDlgProc = MakeProcInstance (msStatusDlgProc, hMainInstance); DialogBox (hMainInstance, IDDLG_STATUS, hdlg, lpfnStatusDlgProc); } break; case IDPB_MAIN_INFO: if (wDeviceID != -1) { // if the movie is playing then stop it if (msIsMoviePlaying) { dwError = mciSendCommand (wDeviceID, MCI_STOP, MCI_WAIT, (DWORD) (LPVOID) &mciAnimPlayParms); if (dwError) { msDisplayMCIError (dwError); break; } } lpfnInfoDlgProc = MakeProcInstance (msInfoDlgProc, hMainInstance); DialogBox (hMainInstance, IDDLG_INFO, hdlg, lpfnInfoDlgProc); } break; case IDPB_MAIN_SEEK: if (wDeviceID != -1) { // if the movie is playing then stop it if (msIsMoviePlaying) { dwError = mciSendCommand (wDeviceID, MCI_STOP, MCI_WAIT, (DWORD) (LPVOID) &mciAnimPlayParms); if (dwError) { msDisplayMCIError (dwError); break; } } lpfnSeekDlgProc = MakeProcInstance (msSeekDlgProc, hMainInstance); DialogBox (hMainInstance, IDDLG_SEEK, hdlg, lpfnSeekDlgProc); } break; case IDPB_MAIN_STOP: dwError = mciSendCommand (wDeviceID, MCI_STOP, MCI_WAIT, (DWORD) (LPVOID) &mciAnimPlayParms); if (dwError) { msDisplayMCIError (dwError); } break; case IDPB_MAIN_PAUSE: dwError = mciSendCommand (wDeviceID, MCI_PAUSE, MCI_WAIT, (DWORD) (LPVOID) &mciAnimPlayParms); if (dwError) { msDisplayMCIError (dwError); } break; case IDPB_MAIN_CLOSE: dwError = mciSendCommand (wDeviceID, MCI_CLOSE, MCI_WAIT, (DWORD) (LPVOID) &mciAnimPlayParms); if (!dwError) { if (wDeviceID != -1) wDeviceID = -1; // fill the play window with gray msFillWindowColor (GetDlgItem (hdlg, IDST_MAIN_PLAYWND), GRAY_BRUSH); msSetControlsState (hdlg, FALSE); // grey all the controls } else { msDisplayMCIError (dwError); } break; case IDPB_MAIN_PLAY_FORWARD: dwError = mciSendCommand (wDeviceID, MCI_PLAY, 0, (DWORD) (LPVOID) &mciAnimPlayParms); if (dwError) { msDisplayMCIError (dwError); } break; case IDPB_MAIN_PLAY_REVERSE: dwError = mciSendCommand (wDeviceID, MCI_PLAY, MCI_ANIM_PLAY_REVERSE, (DWORD) (LPVOID) &mciAnimPlayParms); if (dwError) { msDisplayMCIError (dwError); } break; case IDPB_MAIN_STEP_FORWARD: mciAnimStepParms.dwFrames = 1; dwError = mciSendCommand (wDeviceID, MCI_STEP, MCI_WAIT | MCI_ANIM_STEP_FRAMES, (DWORD) (LPVOID) &mciAnimStepParms); if (dwError) { msDisplayMCIError (dwError); } break; case IDPB_MAIN_STEP_REVERSE: mciAnimStepParms.dwFrames = 1; dwError = mciSendCommand (wDeviceID, MCI_STEP, MCI_WAIT | MCI_ANIM_STEP_FRAMES | MCI_ANIM_STEP_REVERSE, (DWORD) (LPVOID) &mciAnimStepParms); if (dwError) { msDisplayMCIError (dwError); } break; case IDPB_MAIN_OPEN: // call the open dialog box lpfnOpenDlgProc = MakeProcInstance (msOpenDlgProc, hMainInstance); DialogBox (hMainInstance, IDDLG_OPEN, hdlg, lpfnOpenDlgProc); FreeProcInstance (lpfnOpenDlgProc); // set focus back to the main dialog SetFocus (hdlgMain); break; case IDCB_MAIN_BKGND_LOAD: bBackgroundLoad = !bBackgroundLoad; CheckDlgButton (hdlg, IDCB_MAIN_BKGND_LOAD, bBackgroundLoad); break; case IDCB_MAIN_FULL_SCRN: if (wDeviceID != -1) { if (!bFullScreen) { mciAnimWindowParms.hWnd = MCI_ANIM_WINDOW_DEFAULT; dwError = mciSendCommand (wDeviceID, MCI_WINDOW, MCI_ANIM_WINDOW_HWND, (DWORD) (LPVOID) &mciAnimWindowParms); } else { mciAnimWindowParms.hWnd = GetDlgItem (hdlg, IDST_MAIN_PLAYWND); dwError = mciSendCommand (wDeviceID, MCI_WINDOW, MCI_ANIM_WINDOW_HWND, (DWORD) (LPVOID) &mciAnimWindowParms); } if (dwError) { msDisplayMCIError (dwError); break; } else { bFullScreen = !bFullScreen; CheckDlgButton (hdlg, IDCB_MAIN_FULL_SCRN, bFullScreen); } dwError = mciSendCommand (wDeviceID, MCI_SEEK, MCI_WAIT | MCI_SEEK_TO_START, (DWORD) (LPVOID) &mciAnimPlayParms); if (!dwError) { dwError = mciSendCommand (wDeviceID, MCI_STOP, MCI_WAIT, (DWORD) (LPVOID) &mciAnimPlayParms); } if (dwError) { msDisplayMCIError (dwError); } else { // set focus back to the main dialog SetFocus (hdlg); } } break; default: // Message not processed return(FALSE); } // Message processed return(TRUE); break; case WM_CLOSE: if (wDeviceID != -1) { dwError = mciSendCommand (wDeviceID, MCI_CLOSE, MCI_WAIT, (DWORD) (LPVOID) &mciAnimPlayParms); if (dwError) { msDisplayMCIError (dwError); } } EndDialog (hdlg, FALSE); break; default: // Message not processed return(FALSE); } return(FALSE); } /****************************************************************************** Function: msOpenDlgProc () - windows callable Desc: Dialog procedure for the 'Open' dialog box. Returns: BOOL TRUE - OK was pressed FALSE - Cancel was pressed ******************************************************************************/ BOOL FAR PASCAL msOpenDlgProc ( HWND hdlg, unsigned message, WORD wParam, LONG lParam) { // MCI structure that is needed when loading a movie MCI_ANIM_OPEN_PARMS mciAnimOpenParms; // MCI structure that is needed when playing a movie MCI_ANIM_PLAY_PARMS mciAnimPlayParms; char szFile[msMAX]; DWORD dwError; switch (message) { case WM_INITDIALOG: SendDlgItemMessage(hdlg, IDEB_OPEN_MOVIE_FILE, EM_LIMITTEXT, msMAX, 0L); return(TRUE); break; case WM_COMMAND: switch (wParam) { case IDPB_OK: // gets the filename from the dialog GetDlgItemText (hdlg, IDEB_OPEN_MOVIE_FILE, szFile, msMAX-1); // if we already have a movie open then we close it if (wDeviceID != -1) { mciSendCommand (wDeviceID, MCI_CLOSE, MCI_WAIT, (DWORD) (LPVOID) &mciAnimPlayParms); wDeviceID = -1; } // disable all the controls msSetControlsState (hdlgMain, FALSE); mciAnimOpenParms.lpstrDeviceType = "animation"; mciAnimOpenParms.lpstrElementName = (LPSTR) szFile; mciAnimOpenParms.dwStyle = WS_OVERLAPPED | WS_THICKFRAME; mciAnimOpenParms.lpstrAlias = "Scarper"; mciAnimOpenParms.dwCallback = hdlgMain; // if the background load is on, we allow the movie // to load while the user does other "stuff". if (bBackgroundLoad) { // Hide this dialog box while we are loading ShowWindow (hdlg, SW_HIDE); dwError = mciSendCommand (NULL, MCI_OPEN, MCI_OPEN_ALIAS | MCI_NOTIFY | MCI_OPEN_ELEMENT | MCI_OPEN_TYPE | MCI_ANIM_OPEN_WS, (DWORD) (LPVOID) &mciAnimOpenParms); } else { // Hide this dialog box while we are loading ShowWindow (hdlg, SW_HIDE); dwError = mciSendCommand (NULL, MCI_OPEN, MCI_OPEN_ALIAS | MCI_WAIT | MCI_NOTIFY | MCI_OPEN_ELEMENT | MCI_OPEN_TYPE | MCI_ANIM_OPEN_WS, (DWORD) (LPVOID) &mciAnimOpenParms); } if (dwError) { SetFocus (hdlgMain); msDisplayMCIError (dwError); } else { wDeviceID = mciAnimOpenParms.wDeviceID; } // if there was an error we return FALSE, else return TRUE EndDialog (hdlg, !dwError); break; case IDPB_CANCEL: EndDialog (hdlg, FALSE); break; default: // Message not processed return(FALSE); } // Message processed return(TRUE); break; case WM_CLOSE: EndDialog (hdlg, FALSE); break; default: // Message not processed return(FALSE); } return(FALSE); } /****************************************************************************** Function: msSeekDlgProc () - windows callable Desc: Dialog procedure for the 'Seek' dialog box. Returns: BOOL TRUE - OK was pressed FALSE - Cancel was pressed ******************************************************************************/ BOOL FAR PASCAL msSeekDlgProc ( HWND hdlg, unsigned message, WORD wParam, LONG lParam) { // MCI structure that is needed when seeking within movie MCI_SEEK_PARMS mciSeekParms; int nToFrame; BOOL bNoError; DWORD dwError; switch (message) { case WM_INITDIALOG: return(TRUE); break; case WM_COMMAND: switch (wParam) { case IDPB_OK: nToFrame = GetDlgItemInt (hdlg, IDEB_SEEK_TOFRAME, &bNoError, FALSE); if (bNoError) { mciSeekParms.dwTo = nToFrame; dwError = mciSendCommand (wDeviceID, MCI_SEEK, MCI_WAIT | MCI_TO, (DWORD) (LPVOID) &mciSeekParms); if (dwError) { msDisplayMCIError (dwError); } else { EndDialog (hdlg, FALSE); } } break; case IDPB_CANCEL: EndDialog (hdlg, FALSE); break; default: // Message not processed return(FALSE); } // Message processed return(TRUE); break; case WM_CLOSE: EndDialog (hdlg, FALSE); break; default: // Message not processed return(FALSE); } return(FALSE); } /****************************************************************************** Function: msDisplayError () - local Desc: Handles all the error message for the MCI commands. Returns: VOID ******************************************************************************/ VOID msDisplayMCIError (DWORD dwError) { char szError[msMAX]; char szTitle[msMAX]; // converts the ID of the error into a string and displays it to the user mciGetErrorString (dwError, szError, msMAX-1); LoadString (hMainInstance,IDS_ERROR_TITLE, szTitle, sizeof(szTitle)-1); MessageBox (NULL, szError, szTitle,MB_ICONSTOP | MB_OK | MB_TASKMODAL); } static VOID msEnableDlgItem (HWND hdlg, WORD wId, BOOL bEnable) { HWND hwnd = GetDlgItem (hdlg, wId); if (IsWindow (hwnd)) EnableWindow (hwnd, bEnable); } /****************************************************************************** Function: msSetControlsState () - local Desc: Enable or disables all the controls (expect Open). Returns: VOID ******************************************************************************/ VOID msSetControlsState ( HWND hdlg, BOOL bState) { // Need to Grey all the control that can't be used // unless a movie has been opened msEnableDlgItem (hdlg, IDPB_MAIN_CLOSE, bState); msEnableDlgItem (hdlg, IDCB_MAIN_FULL_SCRN, bState); msEnableDlgItem (hdlg, IDPB_MAIN_STOP, bState); msEnableDlgItem (hdlg, IDPB_MAIN_PAUSE, bState); msEnableDlgItem (hdlg, IDPB_MAIN_PLAY_FORWARD, bState); msEnableDlgItem (hdlg, IDPB_MAIN_PLAY_REVERSE, bState); msEnableDlgItem (hdlg, IDPB_MAIN_STEP_REVERSE, bState); msEnableDlgItem (hdlg, IDPB_MAIN_STEP_FORWARD, bState); msEnableDlgItem (hdlg, IDPB_MAIN_SEEK, bState); msEnableDlgItem (hdlg, IDPB_MAIN_DEV_CAP, bState); msEnableDlgItem (hdlg, IDPB_MAIN_STATUS, bState); msEnableDlgItem (hdlg, IDPB_MAIN_INFO, bState); msEnableDlgItem (hdlg, IDPB_MAIN_TOSTART, bState); msEnableDlgItem (hdlg, IDPB_MAIN_TOEND, bState); } /****************************************************************************** Function: msDevCapsDlgProc () - windows callable Desc: Dialog procedure for the 'Device Capabilities' dialog box. Returns: BOOL TRUE - OK was pressed FALSE - Cancel was pressed ******************************************************************************/ BOOL FAR PASCAL msDevCapsDlgProc ( HWND hdlg, unsigned message, WORD wParam, LONG lParam) { MCI_GETDEVCAPS_PARMS mciGetDevCapsParms; DWORD dwResult; char szResult[msMAX]; switch (message) { case WM_INITDIALOG: // set dialog if the device can be ejected msSetDlgItemCaps (hdlg, MCI_GETDEVCAPS_CAN_EJECT, IDST_DEVCAP_EJECT); // sets dialog if the device can be played msSetDlgItemCaps (hdlg, MCI_GETDEVCAPS_CAN_PLAY, IDST_DEVCAP_PLAY); // sets dialog if the device can be record msSetDlgItemCaps (hdlg, MCI_GETDEVCAPS_CAN_RECORD, IDST_DEVCAP_RECORD); // sets dialog if the device can be save msSetDlgItemCaps (hdlg, MCI_GETDEVCAPS_CAN_SAVE, IDST_DEVCAP_SAVE); // sets dialog if the device can use device elements msSetDlgItemCaps (hdlg, MCI_GETDEVCAPS_COMPOUND_DEVICE, IDST_DEVCAP_DEVELE); // finds out the type of device we are working with mciGetDevCapsParms.dwItem = MCI_GETDEVCAPS_DEVICE_TYPE; mciSendCommand (wDeviceID, MCI_GETDEVCAPS, MCI_WAIT | MCI_GETDEVCAPS_ITEM, (DWORD) (LPVOID) &mciGetDevCapsParms); dwResult = mciGetDevCapsParms.dwReturn; switch (dwResult) { case MCI_DEVTYPE_ANIMATION: LoadString (hMainInstance,IDS_DEVTYPE_ANIMATION, szResult, sizeof(szResult)-1); SetWindowText (GetDlgItem (hdlg, IDST_DEVCAP_DEVTYPE), szResult); break; case MCI_DEVTYPE_CD_AUDIO: LoadString (hMainInstance,IDS_DEVTYPE_CD_AUDIO, szResult, sizeof(szResult)-1); SetWindowText (GetDlgItem (hdlg, IDST_DEVCAP_DEVTYPE), szResult); break; case MCI_DEVTYPE_DAT: LoadString (hMainInstance,IDS_DEVTYPE_DAT, szResult, sizeof(szResult)-1); SetWindowText (GetDlgItem (hdlg, IDST_DEVCAP_DEVTYPE), szResult); break; case MCI_DEVTYPE_DIGITAL_VIDEO: LoadString (hMainInstance,IDS_DEVTYPE_DIGITAL_VIDEO, szResult, sizeof(szResult)-1); SetWindowText (GetDlgItem (hdlg, IDST_DEVCAP_DEVTYPE), szResult); break; case MCI_DEVTYPE_OTHER: LoadString (hMainInstance,IDS_DEVTYPE_OTHER, szResult, sizeof(szResult)-1); SetWindowText (GetDlgItem (hdlg, IDST_DEVCAP_DEVTYPE), szResult); break; case MCI_DEVTYPE_OVERLAY: LoadString (hMainInstance,IDS_DEVTYPE_OVERLAY, szResult, sizeof(szResult)-1); SetWindowText (GetDlgItem (hdlg, IDST_DEVCAP_DEVTYPE), szResult); break; case MCI_DEVTYPE_SCANNER: LoadString (hMainInstance,IDS_DEVTYPE_SCANNER, szResult, sizeof(szResult)-1); SetWindowText (GetDlgItem (hdlg, IDST_DEVCAP_DEVTYPE), szResult); break; case MCI_DEVTYPE_SEQUENCER: LoadString (hMainInstance,IDS_DEVTYPE_SEQUENCER, szResult, sizeof(szResult)-1); SetWindowText (GetDlgItem (hdlg, IDST_DEVCAP_DEVTYPE), szResult); break; case MCI_DEVTYPE_VIDEODISC: LoadString (hMainInstance,IDS_DEVTYPE_VIDEODISC, szResult, sizeof(szResult)-1); SetWindowText (GetDlgItem (hdlg, IDST_DEVCAP_DEVTYPE), szResult); break; // Video not supported in the version of MCI I am working with // case MCI_DEVTYPE_VIDEOTAPE: // LoadString (hMainInstance,IDS_DEVTYPE_VIDEOTAPE, // szResult, sizeof(szResult)-1); // SetWindowText (GetDlgItem (hdlg, IDST_DEVCAP_DEVTYPE), szResult); // break; case MCI_DEVTYPE_WAVEFORM_AUDIO: LoadString (hMainInstance,IDS_DEVTYPE_WAVEFORM_AUDIO, szResult, sizeof(szResult)-1); SetWindowText (GetDlgItem (hdlg, IDST_DEVCAP_DEVTYPE), szResult); break; deafault: LoadString (hMainInstance,IDS_UNKNOWN, szResult, sizeof(szResult)-1); SetWindowText (GetDlgItem (hdlg, IDST_DEVCAP_DEVTYPE), szResult); break; } // sets dialog if the device has audio msSetDlgItemCaps (hdlg, MCI_GETDEVCAPS_HAS_AUDIO, IDST_DEVCAP_AUDIO); // sets dialog if the device has video msSetDlgItemCaps (hdlg, MCI_GETDEVCAPS_HAS_VIDEO, IDST_DEVCAP_VIDEO); // sets dialog if the device can use user files msSetDlgItemCaps (hdlg, MCI_GETDEVCAPS_USES_FILES, IDST_DEVCAP_USESFILES); // sets dialog if the device can play in reverse msSetDlgItemCaps (hdlg, MCI_ANIM_GETDEVCAPS_CAN_REVERSE, IDST_DEVCAP_PLAYREVERSE); // sets dialog if the device can stretch msSetDlgItemCaps (hdlg, MCI_ANIM_GETDEVCAPS_CAN_STRETCH, IDST_DEVCAP_STRETCH); // finds out the fast rate of the device mciGetDevCapsParms.dwItem = MCI_ANIM_GETDEVCAPS_FAST_RATE; mciSendCommand (wDeviceID, MCI_GETDEVCAPS, MCI_WAIT | MCI_GETDEVCAPS_ITEM, (DWORD) (LPVOID) &mciGetDevCapsParms); dwResult = mciGetDevCapsParms.dwReturn; if (dwResult == MCIERR_UNSUPPORTED_FUNCTION) { LoadString (hMainInstance,IDS_UNSUPPORTED_FUNCTION, szResult, sizeof(szResult)-1); SetWindowText (GetDlgItem (hdlg, IDST_DEVCAP_FASTRATE), szResult); } else { ltoa (dwResult, szResult, 10); SetWindowText (GetDlgItem (hdlg, IDST_DEVCAP_FASTRATE), szResult); } // finds out the normal rate of the device mciGetDevCapsParms.dwItem = MCI_ANIM_GETDEVCAPS_NORMAL_RATE; mciSendCommand (wDeviceID, MCI_GETDEVCAPS, MCI_WAIT | MCI_GETDEVCAPS_ITEM, (DWORD) (LPVOID) &mciGetDevCapsParms); dwResult = mciGetDevCapsParms.dwReturn; if (dwResult == MCIERR_UNSUPPORTED_FUNCTION) { LoadString (hMainInstance,IDS_UNSUPPORTED_FUNCTION, szResult, sizeof(szResult)-1); SetWindowText (GetDlgItem (hdlg, IDST_DEVCAP_NORMRATE), szResult); } else { ltoa (dwResult, szResult, 10); SetWindowText (GetDlgItem (hdlg, IDST_DEVCAP_NORMRATE), szResult); } // finds out the slow rate of the device mciGetDevCapsParms.dwItem = MCI_ANIM_GETDEVCAPS_SLOW_RATE; mciSendCommand (wDeviceID, MCI_GETDEVCAPS, MCI_WAIT | MCI_GETDEVCAPS_ITEM, (DWORD) (LPVOID) &mciGetDevCapsParms); dwResult = mciGetDevCapsParms.dwReturn; if (dwResult == MCIERR_UNSUPPORTED_FUNCTION) { LoadString (hMainInstance,IDS_UNSUPPORTED_FUNCTION, szResult, sizeof(szResult)-1); SetWindowText (GetDlgItem (hdlg, IDST_DEVCAP_SLOWRATE), szResult); } else { ltoa (dwResult, szResult, 10); SetWindowText (GetDlgItem (hdlg, IDST_DEVCAP_SLOWRATE), szResult); } // finds out the max windows this device can handle mciGetDevCapsParms.dwItem = MCI_ANIM_GETDEVCAPS_MAX_WINDOWS; mciSendCommand (wDeviceID, MCI_GETDEVCAPS, MCI_WAIT | MCI_GETDEVCAPS_ITEM, (DWORD) (LPVOID) &mciGetDevCapsParms); dwResult = mciGetDevCapsParms.dwReturn; ltoa (dwResult, szResult, 10); SetWindowText (GetDlgItem (hdlg, IDST_DEVCAP_MAXWIN), szResult); // sets dialog if the device can use palettes msSetDlgItemCaps (hdlg, MCI_ANIM_GETDEVCAPS_PALETTES, IDST_DEVCAP_PALETTE); return(TRUE); break; case WM_COMMAND: switch (wParam) { case IDPB_OK: EndDialog (hdlg, TRUE); break; default: // Message not processed return(FALSE); } // Message processed return(TRUE); break; case WM_CLOSE: EndDialog (hdlg, FALSE); break; default: // Message not processed return(FALSE); } return(FALSE); } /****************************************************************************** Function: msInfoDlgProc () - windows callable Desc: Dialog procedure for the 'Info' dialog box. Returns: BOOL TRUE - OK was pressed FALSE - Cancel was pressed ******************************************************************************/ BOOL FAR PASCAL msInfoDlgProc ( HWND hdlg, unsigned message, WORD wParam, LONG lParam) { MCI_VERSION_PARMS mciVerParms; MCI_GETDEVCAPS_PARMS mciGetDevCapsParms; MCI_INFO_PARMS mciInfoParms; char szResult[msMAX]; DWORD dwError; char szIn[msMAX]; char szOut[msMAX]; switch (message) { case WM_INITDIALOG: // finds out if the device can use user files mciGetDevCapsParms.dwItem = MCI_GETDEVCAPS_USES_FILES; mciSendCommand (wDeviceID, MCI_GETDEVCAPS, MCI_WAIT | MCI_GETDEVCAPS_ITEM, (DWORD) (LPVOID) &mciGetDevCapsParms); if (mciGetDevCapsParms.dwReturn) { // finds out the filename of the device mciInfoParms.lpstrReturn = szResult; mciInfoParms.dwRetSize = sizeof(szResult); dwError = mciSendCommand (wDeviceID, MCI_INFO, MCI_WAIT | MCI_INFO_FILE, (DWORD) (LPVOID) &mciInfoParms); if (dwError) { msDisplayMCIError (dwError); } else { SetWindowText (GetDlgItem (hdlg, IDST_INFO_FILENAME), mciInfoParms.lpstrReturn); } } else { LoadString (hMainInstance,IDS_UNSUPPORTED_FUNCTION, szResult, sizeof(szResult)-1); SetWindowText (GetDlgItem (hdlg, IDST_INFO_FILENAME), szResult); } // finds out the caption on the window of the device dwError = mciSendCommand (wDeviceID, MCI_INFO, MCI_ANIM_INFO_TEXT, (DWORD) (LPVOID) &mciInfoParms); if (dwError) { msDisplayMCIError (dwError); } else { SetWindowText (GetDlgItem (hdlg, IDST_INFO_CAPTION), mciInfoParms.lpstrReturn); } // finds out the product info dwError = mciSendCommand (wDeviceID, MCI_INFO, MCI_INFO_PRODUCT, (DWORD) (LPVOID) &mciInfoParms); if (dwError) { msDisplayMCIError (dwError); } else { SetWindowText (GetDlgItem (hdlg, IDST_INFO_PRODUCT), mciInfoParms.lpstrReturn); } // Get the MCI driver version number // dwError = mciSendCommand (wDeviceID, GOLDDISK_MCI_GETVER, 0, (DWORD) (LPVOID)&mciVerParms); // To use mciSendString we need to use an alias like "Scarper" // the version is returned in the dwReturn field of the mciVerParms struct // eg. dwError = mciSendString ("version Scarper", szOut, sizeof (szOut), &mciVerParms); if (dwError) { msDisplayMCIError (dwError); } else { GetDlgItemText (hdlg, IDST_INFO_DDVERSION, (LPSTR) szIn, sizeof(szIn)-1); wsprintf ((LPSTR) szOut, "%s %d.%02.02d.%02.02d", (LPSTR) szIn, GetRValue(mciVerParms.dwReturn), GetGValue(mciVerParms.dwReturn), GetBValue(mciVerParms.dwReturn)); SetDlgItemText (hdlg, IDST_INFO_DDVERSION, (LPSTR) szOut); } return(TRUE); break; case WM_COMMAND: switch (wParam) { case IDPB_OK: EndDialog (hdlg, TRUE); break; default: // Message not processed return(FALSE); } // Message processed return(TRUE); break; case WM_CLOSE: EndDialog (hdlg, FALSE); break; default: // Message not processed return(FALSE); } return(FALSE); } /****************************************************************************** Function: msStatusDlgProc () - windows callable Desc: Dialog procedure for the 'Status' dialog box. Returns: BOOL TRUE - OK was pressed FALSE - Cancel was pressed ******************************************************************************/ BOOL FAR PASCAL msStatusDlgProc ( HWND hdlg, unsigned message, WORD wParam, LONG lParam) { MCI_SET_PARMS mciSetParms; MCI_STATUS_PARMS mciStatusParms; char szResult[msMAX]; DWORD dwError; switch (message) { case WM_INITDIALOG: // sets the time format to frames mciSetParms.dwTimeFormat = MCI_FORMAT_FRAMES; mciSendCommand (wDeviceID, MCI_SET, (DWORD) MCI_SET_TIME_FORMAT, (DWORD) (LPSTR) &mciSetParms); // we only have one movie mciStatusParms.dwTrack = (DWORD) 1; // finds out the current frame the movie is on mciStatusParms.dwItem = MCI_STATUS_POSITION; dwError = mciSendCommand (wDeviceID, MCI_STATUS, (DWORD) MCI_STATUS_ITEM, (DWORD) (LPSTR)(&mciStatusParms)); if (dwError) { msDisplayMCIError (dwError); } else { ltoa (mciStatusParms.dwReturn, szResult, 10); SetWindowText (GetDlgItem (hdlg, IDST_STATUS_CURRFRAME), szResult); } // finds out the number of frames in the movie mciStatusParms.dwItem = MCI_STATUS_LENGTH; dwError = mciSendCommand (wDeviceID, MCI_STATUS, (DWORD) MCI_STATUS_ITEM | MCI_TRACK, (DWORD) (LPSTR)(&mciStatusParms)); if (dwError) { msDisplayMCIError (dwError); } else { ltoa (mciStatusParms.dwReturn, szResult, 10); SetWindowText (GetDlgItem (hdlg, IDST_STATUS_NUMFRAMES), szResult); } // finds out the mode of the movie mciStatusParms.dwItem = MCI_STATUS_MODE; dwError = mciSendCommand (wDeviceID, MCI_STATUS, (DWORD) MCI_STATUS_ITEM, (DWORD) (LPSTR)(&mciStatusParms)); if (dwError) { msDisplayMCIError (dwError); } else { switch (mciStatusParms.dwReturn) { case MCI_MODE_NOT_READY: LoadString (hMainInstance, IDS_MODE_NOT_READY, szResult, sizeof(szResult)-1); SetWindowText (GetDlgItem (hdlg, IDST_STATUS_CURRMODE), szResult); break; case MCI_MODE_PAUSE: LoadString (hMainInstance,IDS_MODE_PAUSE, szResult, sizeof(szResult)-1); SetWindowText (GetDlgItem (hdlg, IDST_STATUS_CURRMODE), szResult); break; case MCI_MODE_PLAY: // finds out if we are playing forward mciStatusParms.dwItem = MCI_ANIM_STATUS_FORWARD; dwError = mciSendCommand (wDeviceID, MCI_STATUS, (DWORD) MCI_STATUS_ITEM, (DWORD) (LPSTR)(&mciStatusParms)); if (dwError) { msDisplayMCIError (dwError); } if (mciStatusParms.dwReturn) { LoadString (hMainInstance,IDS_MODE_PLAY_FORWARD, szResult, sizeof(szResult)-1); SetWindowText (GetDlgItem (hdlg, IDST_STATUS_CURRMODE), szResult); } else { LoadString (hMainInstance,IDS_MODE_PLAY_REVERSE, szResult, sizeof(szResult)-1); SetWindowText (GetDlgItem (hdlg, IDST_STATUS_CURRMODE), szResult); } break; case MCI_MODE_STOP: LoadString (hMainInstance,IDS_MODE_STOP, szResult, sizeof(szResult)-1); SetWindowText (GetDlgItem (hdlg, IDST_STATUS_CURRMODE), szResult); break; case MCI_MODE_OPEN: LoadString (hMainInstance,IDS_MODE_OPEN, szResult, sizeof(szResult)-1); SetWindowText (GetDlgItem (hdlg, IDST_STATUS_CURRMODE), szResult); break; case MCI_MODE_RECORD: LoadString (hMainInstance,IDS_MODE_RECORD, szResult, sizeof(szResult)-1); SetWindowText (GetDlgItem (hdlg, IDST_STATUS_CURRMODE), szResult); break; case MCI_MODE_SEEK: LoadString (hMainInstance,IDS_MODE_SEEK, szResult, sizeof(szResult)-1); SetWindowText (GetDlgItem (hdlg, IDST_STATUS_CURRMODE), szResult); break; default: LoadString (hMainInstance,IDS_UNKNOWN, szResult, sizeof(szResult)-1); SetWindowText (GetDlgItem (hdlg, IDST_STATUS_CURRMODE), szResult); break; } } // finds out the speed of animation mciStatusParms.dwItem = MCI_ANIM_STATUS_SPEED; dwError = mciSendCommand (wDeviceID, MCI_STATUS, (DWORD) MCI_STATUS_ITEM, (DWORD) (LPSTR)(&mciStatusParms)); if (dwError) { msDisplayMCIError (dwError); } else { ltoa (mciStatusParms.dwReturn, szResult, 10); SetWindowText (GetDlgItem (hdlg, IDST_STATUS_SPEED), szResult); } mciStatusParms.dwItem = MCI_ANIM_STATUS_HWND; dwError = mciSendCommand (wDeviceID, MCI_STATUS, (DWORD) MCI_STATUS_ITEM, (DWORD) (LPSTR)(&mciStatusParms)); if (dwError) { msDisplayMCIError (dwError); } else { SetDlgItemInt (hdlg, IDST_STATUS_HWND, (WORD)mciStatusParms.dwReturn, FALSE); } return(TRUE); break; case WM_COMMAND: switch (wParam) { case IDPB_OK: EndDialog (hdlg, TRUE); break; default: // Message not processed return(FALSE); } // Message processed return(TRUE); break; case WM_CLOSE: EndDialog (hdlg, FALSE); break; default: // Message not processed return(FALSE); } return(FALSE); } /****************************************************************************** Function: msAboutDlgProc () - windows callable Desc: Dialog procedure for the 'About' dialog box. Returns: BOOL TRUE - OK was pressed ******************************************************************************/ BOOL FAR PASCAL msAboutDlgProc ( HWND hdlg, unsigned message, WORD wParam, LONG lParam) { char szResult[msMAX]; char szIn[msMAX]; char szOut[msMAX]; DWORD dwError; switch (message) { case WM_INITDIALOG: // Set the version number // GetDlgItemText (hdlg, IDST_VERSION, (LPSTR) szIn, sizeof(szIn)-1); wsprintf ((LPSTR) szOut, "%s %d.%02.02d.%02.02d", (LPSTR) szIn, GetRValue(msMCISAMVERSION), GetGValue(msMCISAMVERSION), GetBValue(msMCISAMVERSION)); SetDlgItemText (hdlg, IDST_VERSION, (LPSTR) szOut); return(TRUE); break; case WM_COMMAND: switch (wParam) { case IDPB_OK: EndDialog (hdlg, TRUE); break; default: // Message not processed return(FALSE); } // Message processed return(TRUE); break; case WM_CLOSE: EndDialog (hdlg, FALSE); break; default: // Message not processed return(FALSE); } return(FALSE); } /**************************************************************************** Function: msIsMoviePlaying () - local Desc: Checks to see if we are playing the movie. Returns: BOOL TRUE - We are playing the movie FALSE - We are not playing the movie ****************************************************************************/ BOOL msIsMoviePlaying (VOID) { MCI_STATUS_PARMS mciStatusParms; DWORD dwError; // finds out the mode of the movie mciStatusParms.dwItem = MCI_STATUS_MODE; dwError = mciSendCommand (wDeviceID, MCI_STATUS, (DWORD) MCI_STATUS_ITEM, (DWORD) (LPSTR)(&mciStatusParms)); if (dwError) { msDisplayMCIError (dwError); return FALSE; } else { if (mciStatusParms.dwReturn == MCI_MODE_PLAY) { return TRUE; } } return FALSE; } /**************************************************************************** Function: msFillWindowColor () - local Desc: Fills the given window in the given color. Returns: VOID ****************************************************************************/ VOID msFillWindowColor (HWND hwndPlay, int nIndex) { HDC hdcPlay; POINT ptTopLeft; RECT rc; GetClientRect (hwndPlay, &rc); // Get DC of the window and fill it with the given brush index hdcPlay = GetDC (hwndPlay); FillRect (hdcPlay, &rc, GetStockObject (nIndex)); ReleaseDC (hwndPlay, hdcPlay); } /**************************************************************************** Function: msSetDlgItemCaps () - local Desc: Determines where the given Item is supported or not. Fills the given dialog. Returns: VOID ****************************************************************************/ VOID msSetDlgItemCaps ( HWND hdlg, // handle to the DevCaps dialog DWORD dwItem, // the item to check WORD wId) // the string ID of dwItem { MCI_GETDEVCAPS_PARMS mciGetDevCapsParms; DWORD dwResult; char szResult[msMAX]; mciGetDevCapsParms.dwItem = dwItem; mciSendCommand (wDeviceID, MCI_GETDEVCAPS, MCI_WAIT | MCI_GETDEVCAPS_ITEM, (DWORD) (LPVOID) &mciGetDevCapsParms); if (mciGetDevCapsParms.dwReturn) { LoadString (hMainInstance,IDS_SUPPORTED_FUNCTION, szResult, sizeof(szResult)-1); } else { LoadString (hMainInstance,IDS_UNSUPPORTED_FUNCTION, szResult, sizeof(szResult)-1); } SetWindowText (GetDlgItem (hdlg, wId), szResult); }