/*--------------------------------------------------------------------------*\ | qmci.c - Quick MDI App | | | | Usage: | | To make a quick MDI windows application, modify this source | | | | History: | | 12/15/87 toddla Created | | | \*-------------------------------------------------------------------------*/ #include #include #include "movplay.h" #include "mciwnd.h" #include "preview.h" //!!! in mciwnd.h??? typedef LONG (FAR PASCAL *LPWNDPROC)(); // pointer to a window procedure /*-------------------------------------------------------------------------*\ | | | g l o b a l v a r i a b l e s | | | \*------------------------------------------------------------------------*/ // We have our own copy of the MCIWND.LIB so we better make our own class // names or we'll conflict and blow up! extern char aszMCIWndClassName[]; extern char aszToolbarClassName[]; extern char aszTrackbarClassName[]; char szAppName[] = "MovPlay"; /* change this to your app's name */ char szOpenFilter[] = "Video Files\0*.avi\0" "Wave Files\0*.wav\0" "Midi Files\0*.mid; *.rmi\0" "All Files\0*.*\0"; HANDLE hInstApp; /* Instance handle */ HACCEL hAccelApp; HWND hwndApp; /* Handle to parent window */ HWND hwndMdi; /* Handle to MCI client window */ OFSTRUCT of; OPENFILENAME ofn; char achFileName[128]; /*----------------------------------------------------------------------------*\ \*----------------------------------------------------------------------------*/ long FAR PASCAL _export AppWndProc(HWND, UINT, WPARAM, LPARAM); long FAR PASCAL _export mdiDocWndProc(HWND, unsigned, WORD, LONG); int ErrMsg (LPSTR sz,...); HWND mdiCreateDoc(LPSTR szClass, LPSTR szTitle, LPARAM l); /*----------------------------------------------------------------------------*\ | AppAbout( hDlg, msg, wParam, lParam ) | | | | Description: | | This function handles messages belonging to the "About" dialog box. | | The only message that it looks for is WM_COMMAND, indicating the use | | has pressed the "OK" button. When this happens, it takes down | | the dialog box. | | | | Arguments: | | hDlg window handle of about dialog window | | msg message number | | wParam message-dependent | | lParam message-dependent | | | | Returns: | | TRUE if message has been processed, else FALSE | | | \*----------------------------------------------------------------------------*/ BOOL FAR PASCAL _export AppAbout(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_COMMAND: EndDialog(hwnd,TRUE); return TRUE; case WM_INITDIALOG: return TRUE; } return FALSE; } /*----------------------------------------------------------------------------*\ | AppInit ( hInstance, hPrevInstance ) | | | | Description: | | This is called when the application is first loaded into | | memory. It performs all initialization that doesn't need to be done | | once per instance. | | | | Arguments: | | hPrevInstance instance handle of previous instance | | hInstance instance handle of current instance | | | | Returns: | | TRUE if successful, FALSE if not | | | \*----------------------------------------------------------------------------*/ BOOL AppInit(HANDLE hInst, HANDLE hPrev, LPSTR szCmd, int sw) { WNDCLASS cls; /* Save instance handle for DialogBox */ hInstApp = hInst; hAccelApp = LoadAccelerators(hInstApp, "AppAccel"); if (!hPrev) { cls.hCursor = LoadCursor(NULL,IDC_ARROW); cls.hIcon = LoadIcon(hInst,"AppIcon"); cls.lpszMenuName = "AppMenu"; cls.lpszClassName = szAppName; cls.hbrBackground = (HBRUSH)COLOR_APPWORKSPACE+1; cls.hInstance = hInst; cls.style = 0; cls.lpfnWndProc = (WNDPROC)AppWndProc; cls.cbClsExtra = 0; cls.cbWndExtra = 0; if (!RegisterClass(&cls)) return FALSE; } // This app has its own copy of the MCIWnd stuff, and doesn't use // the copy found in MSVIDEO.DLL We better also have different // class names or else we'll conflict and blow up. // !!! Warning - The variable is not too long! lstrcpy(aszMCIWndClassName, "MCIWndMov"); lstrcpy(aszTrackbarClassName, "TrackMov"); lstrcpy(aszToolbarClassName, "ToolMov"); MCIWndRegisterClass(); hwndApp = #ifdef BIDI CreateWindowEx(WS_EX_BIDI_SCROLL | WS_EX_BIDI_MENU |WS_EX_BIDI_NOICON, #else CreateWindow ( #endif szAppName,szAppName, WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN, CW_USEDEFAULT,0, CW_USEDEFAULT,0, (HWND)NULL, /* no parent */ (HMENU)NULL, /* use class menu */ (HANDLE)hInst, /* handle to window instance */ (LPSTR)NULL /* no params to pass on */ ); /* Make window visible according to the way the app is activated */ ShowWindow(hwndApp,sw); if (szCmd && szCmd[0]) mdiCreateDoc(aszMCIWndClassName, 0, (LPARAM)(LPSTR)szCmd); return TRUE; } /*----------------------------------------------------------------------------*\ | WinMain( hInstance, hPrevInstance, lpszCmdLine, cmdShow ) | | | | Description: | | The main procedure for the App. After initializing, it just goes | | into a message-processing loop until it gets a WM_QUIT message | | (meaning the app was closed). | | | | Arguments: | | hInstance instance handle of this instance of the app | | hPrevInstance instance handle of previous instance, NULL if first | | lpszCmdLine ->null-terminated command line | | cmdShow specifies how the window is initially displayed | | | | Returns: | | The exit code as specified in the WM_QUIT message. | | | \*----------------------------------------------------------------------------*/ int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR szCmdLine, int sw) { MSG msg; if (!AppInit(hInstance,hPrevInstance,szCmdLine,sw)) return FALSE; /* * Polling messages from event queue */ for (;;) { if (PeekMessage(&msg, NULL, 0, 0,PM_REMOVE)) { if (msg.message == WM_QUIT) break; if (hAccelApp && hwndApp && TranslateAccelerator(hwndApp, hAccelApp, &msg)) continue; TranslateMessage(&msg); DispatchMessage(&msg); } else { // idle time here, DONT BE A PIG! WaitMessage(); } } return msg.wParam; } /*----------------------------------------------------------------------------*\ \*----------------------------------------------------------------------------*/ BOOL fDialog(HWND hwnd,int id,FARPROC fpfn) { BOOL f; HANDLE hInst; hInst = (HINSTANCE)GetWindowWord(hwnd,GWW_HINSTANCE); fpfn = MakeProcInstance(fpfn,hInst); f = DialogBox(hInst,MAKEINTRESOURCE(id),hwnd,(DLGPROC)fpfn); FreeProcInstance (fpfn); return f; } /*----------------------------------------------------------------------------*\ \*----------------------------------------------------------------------------*/ #define mdiGetCreateParam(lParam) \ (((LPMDICREATESTRUCT)(((LPCREATESTRUCT)lParam)->lpCreateParams))->lParam) /*----------------------------------------------------------------------------*\ | mdiCreateChild() | | | | Description: | | | | Arguments: | | | | Returns: | | HWND if successful, NULL otherwise | | | \*----------------------------------------------------------------------------*/ HWND mdiCreateChild( HWND hwndMdi, LPSTR szClass, LPSTR szTitle, DWORD dwStyle, int x, int y, int dx, int dy, WORD sw, HMENU hmenu, LPARAM l) { MDICREATESTRUCT mdics; mdics.szClass = szClass; mdics.szTitle = szTitle; mdics.hOwner = (HINSTANCE)GetWindowWord(hwndMdi, GWW_HINSTANCE); mdics.x = x; mdics.y = y; mdics.cx = dx; mdics.cy = dy; mdics.style = dwStyle; mdics.lParam = l; return (HWND)SendMessage(hwndMdi,WM_MDICREATE,0,(LONG)(LPVOID)&mdics); } /*----------------------------------------------------------------------------*\ \*----------------------------------------------------------------------------*/ HWND mdiCreateDoc(LPSTR szClass, LPSTR szTitle, LPARAM l) { return mdiCreateChild(hwndMdi,szClass,szTitle, WS_CLIPCHILDREN | WS_CLIPSIBLINGS | MCIWNDF_SHOWALL, CW_USEDEFAULT,0,CW_USEDEFAULT,0,SW_NORMAL,NULL,l); } /*----------------------------------------------------------------------------*\ | mdiCreateClient() | | | | Description: | | | | Arguments: | | | | Returns: | | HWND if successful, NULL otherwise | | | \*----------------------------------------------------------------------------*/ HWND FAR PASCAL mdiCreateClient(HWND hwndP, HMENU hmenuWindow) { CLIENTCREATESTRUCT ccs; ccs.hWindowMenu = hmenuWindow; ccs.idFirstChild = 100; return #ifdef BIDI CreateWindowEx(WS_EX_BIDI_SCROLL | WS_EX_BIDI_MENU |WS_EX_BIDI_NOICON, #else CreateWindow ( #endif "MDICLIENT",NULL, WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE, 0,0,0,0, hwndP, 0, (HINSTANCE)GetWindowWord(hwndP,GWW_HINSTANCE), (LPVOID)&ccs); } /*----------------------------------------------------------------------------*\ \*----------------------------------------------------------------------------*/ #define mdiActiveDoc() \ (HWND)SendMessage(hwndMdi,WM_MDIGETACTIVE,0,0L) /*----------------------------------------------------------------------------*\ \*----------------------------------------------------------------------------*/ LONG NEAR PASCAL mdiSendMessage(HWND hwndMdi, HWND hwnd, unsigned msg, WORD wParam, LONG lParam) { if (hwnd == (HWND)-1) { for (hwnd = GetWindow(hwndMdi, GW_CHILD); hwnd; hwnd = GetWindow(hwnd, GW_HWNDNEXT)) SendMessage(hwnd, msg, wParam, lParam); return 0L; } else { if (hwnd == NULL) hwnd = (HWND)SendMessage(hwndMdi,WM_MDIGETACTIVE,0,0L); if (hwnd) return SendMessage(hwnd, msg, wParam, lParam); } } /*----------------------------------------------------------------------------*\ | AppWndProc( hwnd, msg, wParam, lParam ) | | | | Description: | | The window proc for the app's main (tiled) window. This processes all | | of the parent window's messages. | | | | Arguments: | | hwnd window handle for the parent window | | msg message number | | wParam message-dependent | | lParam message-dependent | | | | Returns: | | 0 if processed, nonzero if ignored | | | \*----------------------------------------------------------------------------*/ long FAR PASCAL _export AppWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam ) { UINT f; PAINTSTRUCT ps; HDC hdc; HMENU hmenu; HWND hwndMovie; switch (msg) { case WM_COMMAND: hwndMovie = mdiActiveDoc(); switch(wParam) { case MENU_ABOUT: fDialog(hwnd,ABOUTBOX,(FARPROC)AppAbout); break; case MENU_EXIT: PostMessage(hwnd,WM_CLOSE,0,0L); break; case MENU_CLOSE: //PostMessage(hwndMdi, WM_MDIDESTROY, (WPARAM)hwndMovie, 0); PostMessage(hwndMovie, WM_CLOSE, 0, 0L); break; case MENU_CLOSEALL: mdiSendMessage(hwndMdi,(HWND)-1,WM_CLOSE,0,0); break; case MENU_NEW: mdiCreateDoc(aszMCIWndClassName, "Untitled", 0); break; case MENU_OPEN: /* prompt user for file to open */ ofn.lStructSize = sizeof(OPENFILENAME); ofn.hwndOwner = hwnd; ofn.hInstance = NULL; ofn.lpstrFilter = szOpenFilter; ofn.lpstrCustomFilter = NULL; ofn.nMaxCustFilter = 0; ofn.nFilterIndex = 0; ofn.lpstrFile = achFileName; ofn.nMaxFile = sizeof(achFileName); ofn.lpstrFileTitle = NULL; ofn.nMaxFileTitle = 0; ofn.lpstrInitialDir = NULL; ofn.lpstrTitle = "Open"; ofn.Flags = #ifdef BIDI OFN_BIDIDIALOG | #endif OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY; ofn.nFileOffset = 0; ofn.nFileExtension = 0; ofn.lpstrDefExt = NULL; ofn.lCustData = 0; ofn.lpfnHook = NULL; ofn.lpTemplateName = NULL; if (GetOpenFileNamePreview(&ofn)) { mdiCreateDoc(aszMCIWndClassName, 0, (LPARAM)(LPSTR)achFileName); } break; case WM_MDITILE: case WM_MDICASCADE: case WM_MDIICONARRANGE: SendMessage(hwndMdi, (UINT)wParam, 0, 0); break; /* Movie Menu */ case IDM_PLAY: MCIWndPlay(hwndMovie); break; case IDM_RPLAY: MCIWndPlayReverse(hwndMovie); break; case IDM_STOP: MCIWndStop(hwndMovie); break; case IDM_HOME: MCIWndHome(hwndMovie); break; case IDM_END: MCIWndEnd(hwndMovie); break; case IDM_STEP: MCIWndStep(hwndMovie, 1); break; case IDM_RSTEP: MCIWndStep(hwndMovie, -1); break; /* Styles POPUP */ #define ISCHECKED() (BOOL)(GetMenuState(GetMenu(hwnd), wParam, 0) & MF_CHECKED) case IDM_SRepeat: MCIWndSetRepeat(hwndMovie, !ISCHECKED()); break; case IDM_SAutosizeWindow: MCIWndChangeStyles(hwndMovie, MCIWNDF_NOAUTOSIZEWINDOW, ISCHECKED() ? MCIWNDF_NOAUTOSIZEWINDOW : 0); break; case IDM_SAutosizeMovie: MCIWndChangeStyles(hwndMovie, MCIWNDF_NOAUTOSIZEMOVIE, ISCHECKED() ? MCIWNDF_NOAUTOSIZEMOVIE : 0); break; case IDM_SPlaybar: MCIWndChangeStyles(hwndMovie, MCIWNDF_NOPLAYBAR, ISCHECKED() ? MCIWNDF_NOPLAYBAR : 0); break; case IDM_SRecord: MCIWndChangeStyles(hwndMovie, MCIWNDF_RECORD, ISCHECKED() ? 0 : MCIWNDF_RECORD); break; case IDM_SMenu: MCIWndChangeStyles(hwndMovie, MCIWNDF_NOMENU, ISCHECKED() ? MCIWNDF_NOMENU : 0); break; case IDM_SErrorDlg: MCIWndChangeStyles(hwndMovie, MCIWNDF_NOERRORDLG, ISCHECKED() ? MCIWNDF_NOERRORDLG : 0); break; case IDM_SShowName: MCIWndChangeStyles(hwndMovie, MCIWNDF_SHOWNAME, ISCHECKED() ? 0 : MCIWNDF_SHOWNAME); break; case IDM_SShowMode: MCIWndChangeStyles(hwndMovie, MCIWNDF_SHOWMODE, ISCHECKED() ? 0 : MCIWNDF_SHOWMODE); break; case IDM_SShowPos: MCIWndChangeStyles(hwndMovie, MCIWNDF_SHOWPOS, ISCHECKED() ? 0 : MCIWNDF_SHOWPOS); break; case IDM_SNotifyMedia: MCIWndChangeStyles(hwndMovie, MCIWNDF_NOTIFYMEDIA, ISCHECKED() ? 0 : MCIWNDF_NOTIFYMEDIA); break; case IDM_SNotifyMode: MCIWndChangeStyles(hwndMovie, MCIWNDF_NOTIFYMODE, ISCHECKED() ? 0 : MCIWNDF_NOTIFYMODE); break; case IDM_SNotifyPos: MCIWndChangeStyles(hwndMovie, MCIWNDF_NOTIFYPOS, ISCHECKED() ? 0 : MCIWNDF_NOTIFYPOS); break; case IDM_SNotifySize: MCIWndChangeStyles(hwndMovie, MCIWNDF_NOTIFYSIZE, ISCHECKED() ? 0 : MCIWNDF_NOTIFYSIZE); break; default: mdiSendMessage(hwndMdi,NULL,msg,wParam,lParam); break; } break; case WM_PALETTECHANGED: mdiSendMessage(hwndMdi, (HWND)-1, msg, wParam, lParam); break; case WM_QUERYNEWPALETTE: return mdiSendMessage(hwndMdi, NULL, msg, wParam, lParam); case WM_INITMENUPOPUP: hwndMovie = mdiActiveDoc(); // // Check the styles properly when styles is chosen // !!! Make sure position constants don't change! // hmenu = GetSubMenu(GetSubMenu(GetMenu(hwnd), 1), 10); if (((HMENU)wParam == hmenu) && hwndMovie) { WORD wStyles = MCIWndGetStyles(hwndMovie); CheckMenuItem(hmenu, IDM_SRepeat, MCIWndGetRepeat(hwndMovie) ? MF_CHECKED : MF_UNCHECKED); CheckMenuItem(hmenu, IDM_SAutosizeWindow, (wStyles & MCIWNDF_NOAUTOSIZEWINDOW) ? MF_UNCHECKED : MF_CHECKED); CheckMenuItem(hmenu, IDM_SAutosizeMovie, (wStyles & MCIWNDF_NOAUTOSIZEMOVIE) ? MF_UNCHECKED : MF_CHECKED); CheckMenuItem(hmenu, IDM_SPlaybar, (wStyles & MCIWNDF_NOPLAYBAR) ? MF_UNCHECKED : MF_CHECKED); CheckMenuItem(hmenu, IDM_SRecord, (wStyles & MCIWNDF_RECORD) ? MF_CHECKED :MF_UNCHECKED); CheckMenuItem(hmenu, IDM_SMenu, (wStyles & MCIWNDF_NOMENU) ? MF_UNCHECKED :MF_CHECKED); CheckMenuItem(hmenu, IDM_SErrorDlg, (wStyles & MCIWNDF_NOERRORDLG) ? MF_UNCHECKED :MF_CHECKED); CheckMenuItem(hmenu, IDM_SShowName, (wStyles & MCIWNDF_SHOWNAME) ? MF_CHECKED :MF_UNCHECKED); CheckMenuItem(hmenu, IDM_SShowMode, (wStyles & MCIWNDF_SHOWMODE) ? MF_CHECKED :MF_UNCHECKED); CheckMenuItem(hmenu, IDM_SShowPos, (wStyles & MCIWNDF_SHOWPOS) ? MF_CHECKED :MF_UNCHECKED); CheckMenuItem(hmenu, IDM_SNotifyMedia, (wStyles & MCIWNDF_NOTIFYMEDIA) ? MF_CHECKED :MF_UNCHECKED); CheckMenuItem(hmenu, IDM_SNotifyMode, (wStyles & MCIWNDF_NOTIFYMODE) ? MF_CHECKED :MF_UNCHECKED); CheckMenuItem(hmenu, IDM_SNotifyPos, (wStyles & MCIWNDF_NOTIFYPOS) ? MF_CHECKED :MF_UNCHECKED); CheckMenuItem(hmenu, IDM_SNotifySize, (wStyles & MCIWNDF_NOTIFYSIZE) ? MF_CHECKED :MF_UNCHECKED); } // // Enable/Disable the stuff under the MOVIE popup // !!! Make sure position constants don't change! // if ((HMENU)wParam == GetSubMenu(GetMenu(hwnd), 1)) { EnableMenuItem((HMENU)wParam, 10, MF_BYPOSITION | (hwndMovie ? MF_ENABLED : MF_GRAYED)); if (!hwndMovie || MCIWndGetMode(hwndMovie, NULL, 0) == MCI_MODE_NOT_READY) { f = hwndMovie ? MF_ENABLED : MF_GRAYED; EnableMenuItem((HMENU)wParam, MENU_CLOSE, f); EnableMenuItem((HMENU)wParam, MENU_CLOSEALL, f); EnableMenuItem((HMENU)wParam, IDM_STOP, MF_GRAYED); EnableMenuItem((HMENU)wParam, IDM_PLAY, MF_GRAYED); EnableMenuItem((HMENU)wParam, IDM_RPLAY, MF_GRAYED); EnableMenuItem((HMENU)wParam, IDM_HOME, MF_GRAYED); EnableMenuItem((HMENU)wParam, IDM_END, MF_GRAYED); EnableMenuItem((HMENU)wParam, IDM_STEP, MF_GRAYED); EnableMenuItem((HMENU)wParam, IDM_RSTEP, MF_GRAYED); } else { EnableMenuItem((HMENU)wParam, MENU_CLOSE, MF_ENABLED); EnableMenuItem((HMENU)wParam, MENU_CLOSEALL, MF_ENABLED); f = MCIWndGetMode(hwndMovie, NULL, 0) != MCI_MODE_STOP; EnableMenuItem((HMENU)wParam, IDM_PLAY, !f ? MF_ENABLED : MF_GRAYED); EnableMenuItem((HMENU)wParam, IDM_RPLAY, !f ? MF_ENABLED : MF_GRAYED); EnableMenuItem((HMENU)wParam, IDM_STOP, f ? MF_ENABLED : MF_GRAYED); EnableMenuItem((HMENU)wParam, IDM_HOME, MF_ENABLED); EnableMenuItem((HMENU)wParam, IDM_END, MF_ENABLED); EnableMenuItem((HMENU)wParam, IDM_STEP, MF_ENABLED); EnableMenuItem((HMENU)wParam, IDM_RSTEP,MF_ENABLED); } } return mdiSendMessage(hwndMdi, NULL, msg, wParam, lParam); break; case WM_CREATE: hmenu = GetMenu(hwnd); hwndMdi = mdiCreateClient(hwnd, GetSubMenu(hmenu, GetMenuItemCount(hmenu)-1)); break; case WM_SIZE: MoveWindow(hwndMdi,0,0,LOWORD(lParam),HIWORD(lParam),TRUE); break; case WM_DESTROY: hwndApp = NULL; PostQuitMessage(0); break; case WM_PAINT: hdc = BeginPaint(hwnd, &ps); EndPaint(hwnd, &ps); return 0; } return DefFrameProc(hwnd,hwndMdi,msg,wParam,lParam); } /*----------------------------------------------------------------------------*\ | ErrMsg - Opens a Message box with a error message in it. The user can | | select the OK button to continue or the CANCEL button to kill | | the parent application. | \*----------------------------------------------------------------------------*/ int ErrMsg (LPSTR sz,...) { char ach[128]; wvsprintf(ach,sz,(LPSTR)(&sz+1)); /* Format the string */ MessageBox (NULL,ach,NULL, #ifdef BIDI MB_RTL_READING | #endif MB_OK|MB_ICONEXCLAMATION); return FALSE; }