MCIPLAY.C
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:27k
源码类别:

Windows编程

开发平台:

Visual C++

  1. /*----------------------------------------------------------------------------*
  2.  *
  3.  *  MCIPLAY:
  4.  *
  5.  *    Sample app showing the use of MCIWnd
  6.  *
  7.  *    MCIPLAY is a MDI aplication that demonstates the following:
  8.  *
  9.  *      - Using the MCIWnd window class to play MCI files.
  10.  *
  11.  *----------------------------------------------------------------------------*/
  12. /**************************************************************************
  13.  *
  14.  *  THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
  15.  *  KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
  16.  *  IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR
  17.  *  PURPOSE.
  18.  *
  19.  *  Copyright (C) 1992 - 1996 Microsoft Corporation. All Rights Reserved.
  20.  *
  21.  **************************************************************************/
  22. #define  STRICT
  23. #define  INC_OLE2
  24. #include <windows.h>
  25. #include <windowsx.h>
  26. #include <commdlg.h>
  27. #include <vfw.h>
  28. #include "mciplay.h"
  29. #define BUFSIZE 260
  30. #define MCIPLAY_APP_CLASS "MCIPlay_App"
  31. #define MCIPLAY_DOC_CLASS MCIWND_WINDOW_CLASS
  32. //---------------------------------------------------------------------------
  33. #define ISCHECKED(hwnd,id) (BOOL)(GetMenuState(GetMenu(hwnd), id, 0) & MF_CHECKED)
  34. /*-------------------------------------------------------------------------*
  35. |                                                                          |
  36. |   g l o b a l   v a r i a b l e s                                        |
  37. |                                                                          |
  38. *------------------------------------------------------------------------*/
  39.     HINSTANCE ghInstApp;        /* Instance handle */
  40.     HACCEL ghAccelApp;
  41.     HWND ghwndApp;          /* Handle to parent window */
  42.     HWND ghwndMdi;          /* Handle to MCI client window */
  43.     char gszBuffer[BUFSIZE];
  44. /*----------------------------------------------------------------------------*
  45. *----------------------------------------------------------------------------*/
  46. LRESULT CALLBACK AppWndProc(HWND, UINT, WPARAM, LPARAM);
  47. BOOL    CALLBACK AppAbout(HWND, UINT, WPARAM, LPARAM);
  48. static BOOL AppInit(HINSTANCE, HINSTANCE, LPSTR, int);
  49. static HWND mdiCreateDoc(LPSTR, LPSTR, LPARAM);
  50. static HWND mdiCreateClient(HWND, HMENU);
  51. static LRESULT mdiSendMessage(HWND, HWND, UINT, WPARAM, LPARAM);
  52. static BOOL FormatFilterString(UINT, LPSTR);
  53. static void MCI_OnCommand(HWND, int, HWND, UINT);
  54. static void mdiFilterSendMessage(HWND, UINT, WPARAM, LPARAM);
  55. static void MCI_OnInitMenuPopup(HWND, HMENU, int, BOOL);
  56. static void MCI_OnSize(HWND, UINT, int, int);
  57. /*----------------------------------------------------------------------------*
  58. |   AppAbout( hDlg, msg, wParam, lParam )                                      |
  59. |                                                                              |
  60. |   Description:                                                               |
  61. |       This function handles messages belonging to the "About" dialog box.    |
  62. |       The only message that it looks for is WM_COMMAND, indicating the use   |
  63. |       has pressed the "OK" button.  When this happens, it takes down         |
  64. |       the dialog box.                                                        |
  65. |                                                                              |
  66. |   Arguments:                                                                 |
  67. |       hDlg            window handle of about dialog window                   |
  68. |       msg             message number                                         |
  69. |       wParam          message-dependent                                      |
  70. |       lParam          message-dependent                                      |
  71. |                                                                              |
  72. |   Returns:                                                                   |
  73. |       TRUE if message has been processed, else FALSE                         |
  74. |                                                                              |
  75. *----------------------------------------------------------------------------*/
  76. BOOL CALLBACK AppAbout(
  77. HWND hwnd,
  78. UINT msg,
  79. WPARAM wParam,
  80. LPARAM lParam)
  81. {
  82.     switch (msg) {
  83.         case WM_COMMAND:
  84.         EndDialog(hwnd,TRUE);
  85.         return TRUE;
  86.     }
  87.     return FALSE;
  88. }
  89. /*----------------------------------------------------------------------------*
  90. |   AppInit ( hInstance, hPrevInstance )                                       |
  91. |                                                                              |
  92. |   Description:                                                               |
  93. |       This is called when the application is first loaded into               |
  94. |       memory.  It performs all initialization that doesn't need to be done   |
  95. |       once per instance.                                                     |
  96. |                                                                              |
  97. |   Arguments:                                                                 |
  98. |   hPrevInstance   instance handle of previous instance                       |
  99. |       hInstance       instance handle of current instance                    |
  100. |                                                                              |
  101. |   Returns:                                                                   |
  102. |       TRUE if successful, FALSE if not                                       |
  103. |                                                                              |
  104. *----------------------------------------------------------------------------*/
  105. static BOOL AppInit(
  106. HINSTANCE hInst,
  107. HINSTANCE hPrev,
  108. LPSTR szCmd,
  109. int sw)
  110. {
  111.     WNDCLASS cls;
  112.     WORD wVer;
  113.     char szAppName[BUFSIZE];
  114.     /* Save instance handle for DialogBox */
  115.     ghInstApp = hInst;
  116.     LoadString( ghInstApp, IDS_APPNAME, szAppName, BUFSIZE );
  117.     /* first let's make sure we are running on 1.1 */
  118.     wVer = HIWORD(VideoForWindowsVersion());
  119.     if (wVer < 0x010a){
  120.         char szTitle[BUFSIZE];
  121.         /* oops, we are too old, blow out of here */
  122.         LoadString( ghInstApp, IDS_APPERR, szTitle, BUFSIZE );
  123.         LoadString( ghInstApp, IDS_VFWTOOOLD, gszBuffer, BUFSIZE );
  124.         MessageBeep(MB_ICONHAND);
  125.         MessageBox(NULL, gszBuffer, szTitle, MB_OK|MB_ICONSTOP);
  126.         return FALSE;
  127.     }
  128.     ghAccelApp = LoadAccelerators(ghInstApp, "AppAccel");
  129.     if (!hPrev) {
  130.         cls.hCursor        = LoadCursor(NULL,IDC_ARROW);
  131.         cls.hIcon          = LoadIcon(hInst,"AppIcon");
  132.         cls.lpszMenuName   = "AppMenu";
  133.         cls.lpszClassName  = MCIPLAY_APP_CLASS;
  134.         cls.hbrBackground  = (HBRUSH)(COLOR_APPWORKSPACE+1);
  135.         cls.hInstance      = hInst;
  136.         cls.style          = 0;
  137.         cls.lpfnWndProc    = (WNDPROC)AppWndProc;
  138.         cls.cbClsExtra     = 0;
  139.         cls.cbWndExtra     = 0;
  140.         if (!RegisterClass(&cls))
  141.             return FALSE;
  142.     }
  143.     // !!! Not using MCIWndCreate, so we must init ourselves
  144.     if (!MCIWndRegisterClass())
  145.         return FALSE;
  146.     ghwndApp = CreateWindow(
  147.         MCIPLAY_APP_CLASS,
  148.         szAppName,
  149.         WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,
  150.         CW_USEDEFAULT,
  151.         0,
  152.         CW_USEDEFAULT,
  153.         0,
  154.         (HWND)NULL,   /* no parent */
  155.         (HMENU)NULL,      /* use class menu */
  156.         (HANDLE)hInst,     /* handle to window instance */
  157.         (LPSTR)NULL);     /* no params to pass on */
  158.     /* Make window visible according to the way the app is activated */
  159.     ShowWindow(ghwndApp,sw);
  160.     return TRUE;
  161. }
  162. /*----------------------------------------------------------------------------*
  163. |   WinMain( hInstance, hPrevInstance, lpszCmdLine, cmdShow )                  |
  164. |                                                                              |
  165. |   Description:                                                               |
  166. |       The main procedure for the App.  After initializing, it just goes      |
  167. |       into a message-processing loop until it gets a WM_QUIT message         |
  168. |       (meaning the app was closed).                                          |
  169. |                                                                              |
  170. |   Arguments:                                                                 |
  171. |       hInstance       instance handle of this instance of the app            |
  172. |       hPrevInstance   instance handle of previous instance, NULL if first    |
  173. |       lpszCmdLine     ->null-terminated command line                         |
  174. |       cmdShow         specifies how the window is initially displayed        |
  175. |                                                                              |
  176. |   Returns:                                                                   |
  177. |       The exit code as specified in the WM_QUIT message.                     |
  178. |                                                                              |
  179. *----------------------------------------------------------------------------*/
  180. int PASCAL WinMain(
  181. HINSTANCE hInstance,
  182. HINSTANCE hPrevInstance,
  183. LPSTR szCmdLine,
  184. int sw)
  185. {
  186.     MSG msg;
  187.     if (!AppInit(hInstance,hPrevInstance,szCmdLine,sw))
  188.         return FALSE;
  189.     //Polling messages from event queue
  190.     for (;;) {
  191.         if (PeekMessage(&msg, NULL, 0, 0,PM_REMOVE)) {
  192.             if (msg.message == WM_QUIT)
  193.                 break;
  194.             if (ghAccelApp && ghwndApp && TranslateAccelerator(ghwndApp, ghAccelApp, &msg))
  195.                 continue;
  196.             if(!TranslateMDISysAccel(ghwndMdi, &msg)) {
  197.                 TranslateMessage(&msg);
  198.                 DispatchMessage(&msg);
  199.             }
  200.         } else {
  201.             // idle time here, DONT BE A PIG!
  202.             WaitMessage();
  203.         }
  204.     }
  205.     return msg.wParam;
  206. }
  207. /*----------------------------------------------------------------------------*
  208. *----------------------------------------------------------------------------*/
  209. static HWND mdiCreateDoc(
  210. LPSTR szClass,
  211. LPSTR szTitle,
  212. LPARAM l)
  213. {
  214.     MDICREATESTRUCT mdics;
  215.     mdics.szClass   = szClass;
  216.     mdics.szTitle   = szTitle;
  217.     mdics.hOwner    = ghInstApp;
  218.     mdics.x         = CW_USEDEFAULT;
  219.     mdics.y         = 0;
  220.     mdics.cx        = CW_USEDEFAULT;
  221.     mdics.cy        = 0;
  222.     mdics.style     = WS_CLIPCHILDREN | WS_CLIPSIBLINGS | MCIWNDF_SHOWALL;
  223.     mdics.lParam    = l;
  224.     return FORWARD_WM_MDICREATE(ghwndMdi, (LPMDICREATESTRUCT)&mdics, SendMessage);
  225. }
  226. /*----------------------------------------------------------------------------*
  227. |   mdiCreateClient()                                                          |
  228. |                                                                              |
  229. |   Description:                                                               |
  230. |                                                                              |
  231. |   Arguments:                                                                 |
  232. |                                                                              |
  233. |   Returns:                                                                   |
  234. |   HWND if successful, NULL otherwise                                         |
  235. |                                                                              |
  236. *----------------------------------------------------------------------------*/
  237. static HWND mdiCreateClient(
  238. HWND hwndP,
  239. HMENU hmenuWindow)
  240. {
  241.     CLIENTCREATESTRUCT ccs;
  242.     ccs.hWindowMenu = hmenuWindow;
  243.     ccs.idFirstChild = 100;
  244.     return CreateWindow(
  245.             "MDICLIENT",
  246.             NULL,
  247.             WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE,
  248.             0,
  249.             0,
  250.             0,
  251.             0,
  252.             hwndP,
  253.             0,
  254.             ghInstApp,
  255.             (LPVOID)&ccs);
  256. }
  257. /*----------------------------------------------------------------------------*
  258. *----------------------------------------------------------------------------*/
  259. static LRESULT mdiSendMessage(
  260. HWND hwndMdi,
  261. HWND hwnd,
  262. UINT msg,
  263. WPARAM wParam,
  264. LPARAM lParam)
  265. {
  266.     if (hwnd == (HWND)-1) {
  267.         for (hwnd = GetWindow(hwndMdi, GW_CHILD); hwnd;
  268.                     hwnd = GetWindow(hwnd, GW_HWNDNEXT))
  269.             SendMessage(hwnd, msg, wParam, lParam);
  270.         return 0L;
  271.     } else {
  272.         if (hwnd == NULL)
  273.             hwnd = FORWARD_WM_MDIGETACTIVE(hwndMdi, SendMessage);
  274.         if (hwnd)
  275.             return SendMessage(hwnd, msg, wParam, lParam);
  276.     }
  277. }
  278. //----------------------------------------------------------------------------
  279. // MCI_OnCommand - Handles WM_COMMAND
  280. //----------------------------------------------------------------------------
  281. static void MCI_OnCommand(
  282. HWND hwnd,
  283. int id,
  284. HWND hwndCtl,
  285. UINT codeNotify)
  286. {
  287.     HWND hwndNew;
  288.     HWND hwndMovie = FORWARD_WM_MDIGETACTIVE(ghwndMdi, SendMessage);
  289.     switch(id) {
  290.         case MENU_ABOUT:
  291.             DialogBox(ghInstApp,MAKEINTRESOURCE(ABOUTBOX),hwnd,AppAbout);
  292.             break;
  293.         case MENU_EXIT:
  294.             PostMessage(hwnd,WM_CLOSE,0,0L);
  295.             break;
  296.         case MENU_CLOSE:
  297.             PostMessage(hwndMovie, WM_CLOSE, 0, 0L);
  298.             break;
  299.         case MENU_NEW:
  300.             LoadString( ghInstApp, IDS_UNTITLLED, gszBuffer, BUFSIZE );
  301.             if (hwndNew = mdiCreateDoc(MCIPLAY_DOC_CLASS, gszBuffer, 0))
  302.                 SetFocus(hwndNew);
  303.             break;
  304.         case MENU_OPEN:
  305.         {
  306.             OPENFILENAME ofn;
  307.             char szFileName[BUFSIZE];
  308.             char szFilter[BUFSIZE];
  309.             FormatFilterString( IDS_FILTERSTRING, szFilter );
  310.             /* prompt user for file to open */
  311.             ofn.lStructSize = sizeof(OPENFILENAME);
  312.             ofn.hwndOwner = hwnd;
  313.             ofn.hInstance = NULL;
  314.             ofn.lpstrFilter = szFilter;
  315.             ofn.lpstrCustomFilter = NULL;
  316.             ofn.nMaxCustFilter = 0;
  317.             ofn.nFilterIndex = 0;
  318.             *szFileName = '';
  319.             ofn.lpstrFile = szFileName;
  320.             ofn.nMaxFile = BUFSIZE;
  321.             ofn.lpstrFileTitle = NULL;
  322.             ofn.nMaxFileTitle = 0;
  323.             ofn.lpstrInitialDir = NULL;
  324.             ofn.lpstrTitle = "Open";
  325.             ofn.Flags = OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY;
  326.             ofn.nFileOffset = 0;
  327.             ofn.nFileExtension = 0;
  328.             ofn.lpstrDefExt = NULL;
  329.             ofn.lCustData = 0;
  330.             ofn.lpfnHook = NULL;
  331.             ofn.lpTemplateName = NULL;
  332.             if (GetOpenFileName(&ofn))
  333.                 if (hwndNew = mdiCreateDoc(MCIPLAY_DOC_CLASS, 0, (LPARAM)(LPSTR)szFileName))
  334.                     SetFocus(hwndNew);
  335.         }
  336.         break;
  337.         case WM_MDITILE:
  338.         case WM_MDICASCADE:
  339.         case WM_MDIICONARRANGE:
  340.             SendMessage(ghwndMdi, id, 0, 0);
  341.             break;
  342.         /* Movie Menu */
  343.         case IDM_PLAY:
  344.             MCIWndPlay(hwndMovie);
  345.             break;
  346.         case IDM_RPLAY:
  347.             MCIWndPlayReverse(hwndMovie);
  348.             break;
  349.         case IDM_STOP:
  350.             MCIWndStop(hwndMovie);
  351.             break;
  352.         case IDM_HOME:
  353.             MCIWndHome(hwndMovie);
  354.             break;
  355.         case IDM_END:
  356.             MCIWndEnd(hwndMovie);
  357.             break;
  358.         case IDM_STEP:
  359.             MCIWndStep(hwndMovie, 1);
  360.             break;
  361.         case IDM_RSTEP:
  362.             MCIWndStep(hwndMovie, -1);
  363.             break;
  364.         /* Styles POPUP */
  365.         case IDM_SAutosizeWindow:
  366.             MCIWndChangeStyles(hwndMovie, MCIWNDF_NOAUTOSIZEWINDOW,
  367.                 ISCHECKED(hwnd,id) ? MCIWNDF_NOAUTOSIZEWINDOW : 0);
  368.             break;
  369.         case IDM_SAutosizeMovie:
  370.             MCIWndChangeStyles(hwndMovie, MCIWNDF_NOAUTOSIZEMOVIE,
  371.                 ISCHECKED(hwnd,id) ? MCIWNDF_NOAUTOSIZEMOVIE : 0);
  372.             break;
  373.         case IDM_SPlaybar:
  374.             MCIWndChangeStyles(hwndMovie, MCIWNDF_NOPLAYBAR,
  375.                 ISCHECKED(hwnd,id) ? MCIWNDF_NOPLAYBAR : 0);
  376.             break;
  377.         case IDM_SRecord:
  378.             MCIWndChangeStyles(hwndMovie, MCIWNDF_RECORD,
  379.                 ISCHECKED(hwnd,id) ? 0 : MCIWNDF_RECORD);
  380.             break;
  381.         case IDM_SMenu:
  382.             MCIWndChangeStyles(hwndMovie, MCIWNDF_NOMENU,
  383.                 ISCHECKED(hwnd,id) ? MCIWNDF_NOMENU : 0);
  384.             break;
  385.         case IDM_SErrorDlg:
  386.             MCIWndChangeStyles(hwndMovie, MCIWNDF_NOERRORDLG,
  387.                 ISCHECKED(hwnd,id) ? MCIWNDF_NOERRORDLG : 0);
  388.             break;
  389.         case IDM_SShowName:
  390.             MCIWndChangeStyles(hwndMovie, MCIWNDF_SHOWNAME,
  391.                 ISCHECKED(hwnd,id) ? 0 : MCIWNDF_SHOWNAME);
  392.             break;
  393.         case IDM_SShowMode:
  394.             MCIWndChangeStyles(hwndMovie, MCIWNDF_SHOWMODE,
  395.                 ISCHECKED(hwnd,id) ? 0 : MCIWNDF_SHOWMODE);
  396.             break;
  397.         case IDM_SShowPos:
  398.             MCIWndChangeStyles(hwndMovie, MCIWNDF_SHOWPOS,
  399.                 ISCHECKED(hwnd,id) ? 0 : MCIWNDF_SHOWPOS);
  400.             break;
  401.         case IDM_SNotifyMedia:
  402.             MCIWndChangeStyles(hwndMovie, MCIWNDF_NOTIFYMEDIA,
  403.                 ISCHECKED(hwnd,id) ? 0 : MCIWNDF_NOTIFYMEDIA);
  404.             break;
  405.         case IDM_SNotifyMode:
  406.             MCIWndChangeStyles(hwndMovie, MCIWNDF_NOTIFYMODE,
  407.                 ISCHECKED(hwnd,id) ? 0 : MCIWNDF_NOTIFYMODE);
  408.             break;
  409.         case IDM_SNotifyPos:
  410.             MCIWndChangeStyles(hwndMovie, MCIWNDF_NOTIFYPOS,
  411.                 ISCHECKED(hwnd,id) ? 0 : MCIWNDF_NOTIFYPOS);
  412.             break;
  413.         case IDM_SNotifySize:
  414.             MCIWndChangeStyles(hwndMovie, MCIWNDF_NOTIFYSIZE,
  415.                 ISCHECKED(hwnd,id) ? 0 : MCIWNDF_NOTIFYSIZE);
  416.             break;
  417.         default:
  418.             FORWARD_WM_COMMAND(NULL, id, hwndCtl, codeNotify, mdiFilterSendMessage);
  419.             break;
  420.     }
  421.     return;
  422. }
  423. /*----------------------------------------------------------------------------*/
  424. static void mdiFilterSendMessage(
  425. HWND    hwnd,
  426. UINT    msg,
  427. WPARAM  wParam,
  428. LPARAM  lParam)
  429. {
  430.     mdiSendMessage(ghwndMdi, hwnd, msg, wParam, lParam);
  431. }
  432. //----------------------------------------------------------------------------
  433. // MCI_OnInitMenuPopup - Handles WM_INITMENUPOPUP
  434. //----------------------------------------------------------------------------
  435. static void MCI_OnInitMenuPopup(
  436. HWND hwnd,
  437. HMENU hMenu,
  438. int item,
  439. BOOL fSystemMenu)
  440. {
  441.     HMENU hStylesMenu = GetSubMenu(GetSubMenu(GetMenu(hwnd), 1), 10);
  442.     HMENU hFileMenu = GetSubMenu(GetMenu(hwnd), 0);
  443.     HMENU hMovieMenu = GetSubMenu(GetMenu(hwnd), 1);
  444.     HMENU hWindowMenu = GetSubMenu(GetMenu(hwnd), 2);
  445.     HWND  hwndMovie = FORWARD_WM_MDIGETACTIVE(ghwndMdi, SendMessage);
  446.     UINT f;
  447.     // be sure this isn't the system menu
  448.     if (fSystemMenu)
  449.         return;
  450.     //
  451.     // Check the styles properly when styles is chosen
  452.     // !!! Make sure position constants don't change!
  453.     // Dont forget that some of these styles use multiple bits
  454.     // in wStyles - therefore check carefully.
  455.     if ((hMenu == hStylesMenu) && hwndMovie) {
  456.         UINT  wStyles = MCIWndGetStyles(hwndMovie);
  457.         CheckMenuItem(hStylesMenu, IDM_SAutosizeWindow,
  458.             ((wStyles & MCIWNDF_NOAUTOSIZEWINDOW) == MCIWNDF_NOAUTOSIZEWINDOW) ? MF_UNCHECKED : MF_CHECKED);
  459.         CheckMenuItem(hStylesMenu, IDM_SAutosizeMovie,
  460.             ((wStyles & MCIWNDF_NOAUTOSIZEMOVIE) == MCIWNDF_NOAUTOSIZEMOVIE) ? MF_UNCHECKED : MF_CHECKED);
  461.         CheckMenuItem(hStylesMenu, IDM_SPlaybar,
  462.             ((wStyles & MCIWNDF_NOPLAYBAR) == MCIWNDF_NOPLAYBAR) ? MF_UNCHECKED : MF_CHECKED);
  463.         CheckMenuItem(hStylesMenu, IDM_SRecord,
  464.             ((wStyles & MCIWNDF_RECORD) == MCIWNDF_RECORD) ? MF_CHECKED :MF_UNCHECKED);
  465.         CheckMenuItem(hStylesMenu, IDM_SMenu,
  466.             ((wStyles & MCIWNDF_NOMENU) == MCIWNDF_NOMENU) ? MF_UNCHECKED :MF_CHECKED);
  467.         CheckMenuItem(hStylesMenu, IDM_SErrorDlg,
  468.             ((wStyles & MCIWNDF_NOERRORDLG) == MCIWNDF_NOERRORDLG) ? MF_UNCHECKED :MF_CHECKED);
  469.         CheckMenuItem(hStylesMenu, IDM_SShowName,
  470.             ((wStyles & MCIWNDF_SHOWNAME) == MCIWNDF_SHOWNAME) ? MF_CHECKED :MF_UNCHECKED);
  471.         CheckMenuItem(hStylesMenu, IDM_SShowMode,
  472.             ((wStyles & MCIWNDF_SHOWMODE) == MCIWNDF_SHOWMODE) ? MF_CHECKED :MF_UNCHECKED);
  473.         CheckMenuItem(hStylesMenu, IDM_SShowPos,
  474.             ((wStyles & MCIWNDF_SHOWPOS) == MCIWNDF_SHOWPOS) ? MF_CHECKED :MF_UNCHECKED);
  475.         CheckMenuItem(hStylesMenu, IDM_SNotifyMedia,
  476.             ((wStyles & MCIWNDF_NOTIFYMEDIA) == MCIWNDF_NOTIFYMEDIA) ? MF_CHECKED :MF_UNCHECKED);
  477.         CheckMenuItem(hStylesMenu, IDM_SNotifyMode,
  478.             ((wStyles & MCIWNDF_NOTIFYMODE) == MCIWNDF_NOTIFYMODE) ? MF_CHECKED :MF_UNCHECKED);
  479.         CheckMenuItem(hStylesMenu, IDM_SNotifyPos,
  480.             ((wStyles & MCIWNDF_NOTIFYPOS) == MCIWNDF_NOTIFYPOS) ? MF_CHECKED :MF_UNCHECKED);
  481.         CheckMenuItem(hStylesMenu, IDM_SNotifySize,
  482.             ((wStyles & MCIWNDF_NOTIFYSIZE) == MCIWNDF_NOTIFYSIZE) ? MF_CHECKED :MF_UNCHECKED);
  483.     }
  484.     //
  485.     // Enable/Disable the stuff under the MOVIE popup
  486.     // !!! Make sure position constants don't change!
  487.     //
  488.     else if (hMenu == hMovieMenu) {
  489.         EnableMenuItem( hMenu, 10,
  490.                         MF_BYPOSITION | (hwndMovie ? MF_ENABLED : MF_GRAYED) );
  491.         if ( !hwndMovie
  492.            || MCIWndGetMode(hwndMovie, NULL, 0) == MCI_MODE_NOT_READY) {
  493.             EnableMenuItem( hFileMenu, MENU_CLOSE,
  494.                             hwndMovie ? MF_ENABLED : MF_GRAYED );
  495.             EnableMenuItem(hMenu, IDM_STOP, MF_GRAYED);
  496.             EnableMenuItem(hMenu, IDM_PLAY, MF_GRAYED);
  497.             EnableMenuItem(hMenu, IDM_RPLAY, MF_GRAYED);
  498.             EnableMenuItem(hMenu, IDM_HOME, MF_GRAYED);
  499.             EnableMenuItem(hMenu, IDM_END, MF_GRAYED);
  500.             EnableMenuItem(hMenu, IDM_STEP, MF_GRAYED);
  501.             EnableMenuItem(hMenu, IDM_RSTEP, MF_GRAYED);
  502.         } else {
  503.             EnableMenuItem(hFileMenu, MENU_CLOSE, MF_ENABLED);
  504.             f = MCIWndGetMode(hwndMovie, NULL, 0) != MCI_MODE_STOP;
  505.             EnableMenuItem(hMenu, IDM_PLAY, !f ? MF_ENABLED : MF_GRAYED);
  506.             EnableMenuItem(hMenu, IDM_RPLAY, !f ? MF_ENABLED : MF_GRAYED);
  507.             EnableMenuItem(hMenu, IDM_STOP, f ? MF_ENABLED : MF_GRAYED);
  508.             EnableMenuItem(hMenu, IDM_HOME, MF_ENABLED);
  509.             EnableMenuItem(hMenu, IDM_END,  MF_ENABLED);
  510.             EnableMenuItem(hMenu, IDM_STEP, MF_ENABLED);
  511.             EnableMenuItem(hMenu, IDM_RSTEP,MF_ENABLED);
  512.         }
  513.     }
  514.     //
  515.     // Enable/Disable the stuff under the WINDOW menu
  516.     // !!! Make sure position constants don't change!
  517.     //
  518.     else if (hMenu == hWindowMenu) {
  519.             EnableMenuItem(hMenu, 0,
  520.                         MF_BYPOSITION | (hwndMovie ? MF_ENABLED : MF_GRAYED));
  521.             EnableMenuItem(hMenu, 1,
  522.                         MF_BYPOSITION | (hwndMovie ? MF_ENABLED : MF_GRAYED));
  523.             EnableMenuItem(hMenu, 2,
  524.                         MF_BYPOSITION | (hwndMovie ? MF_ENABLED : MF_GRAYED));
  525.     }
  526.     //
  527.     // Enable/Disable the stuff under the FILE menu
  528.     //
  529.     else if (hMenu == hFileMenu) {
  530.         EnableMenuItem( hFileMenu, MENU_CLOSE,
  531.                         hwndMovie ? MF_ENABLED : MF_GRAYED);
  532.     }
  533.     FORWARD_WM_INITMENUPOPUP(NULL, hMenu, item,
  534.                              fSystemMenu, mdiFilterSendMessage);
  535.     return;
  536. }
  537. //----------------------------------------------------------------------------
  538. // MCI_OnSize - Handles WM_SIZE
  539. //----------------------------------------------------------------------------
  540. static void MCI_OnSize(
  541. HWND hwnd,
  542. UINT state,
  543. int cx,
  544. int cy)
  545. {
  546.     MoveWindow(ghwndMdi,0,0,cx,cy,TRUE);
  547.     return;
  548. }
  549. /*----------------------------------------------------------------------------*
  550. |   AppWndProc( hwnd, msg, wParam, lParam )                                    |
  551. |                                                                              |
  552. |   Description:                                                               |
  553. |       The window proc for the app's main (tiled) window.  This processes all |
  554. |       of the parent window's messages.                                       |
  555. |                                                                              |
  556. |   Arguments:                                                                 |
  557. |       hwnd            window handle for the parent window                    |
  558. |       msg             message number                                         |
  559. |       wParam          message-dependent                                      |
  560. |       lParam          message-dependent                                      |
  561. |                                                                              |
  562. |   Returns:                                                                   |
  563. |       0 if processed, nonzero if ignored                                     |
  564. |                                                                              |
  565. *----------------------------------------------------------------------------*/
  566. LRESULT CALLBACK AppWndProc(
  567. HWND hwnd,
  568. UINT msg,
  569. WPARAM wParam,
  570. LPARAM lParam)
  571. {
  572.     switch (msg) {
  573.        case WM_CREATE:
  574.         ghwndMdi = mdiCreateClient(hwnd, GetSubMenu(GetMenu(hwnd), GetMenuItemCount(GetMenu(hwnd))-1));
  575.         break;
  576.         case WM_COMMAND:
  577.             HANDLE_WM_COMMAND(hwnd, wParam, lParam, MCI_OnCommand);
  578.             break;
  579.     case WM_PALETTECHANGED:
  580.         mdiSendMessage(ghwndMdi, (HWND)-1, msg, wParam, lParam);
  581.         break;
  582.     case WM_QUERYNEWPALETTE:
  583.         return mdiSendMessage(ghwndMdi, NULL, msg, wParam, lParam);
  584.             break;
  585.         case WM_INITMENUPOPUP:
  586.         HANDLE_WM_INITMENUPOPUP(hwnd, wParam, lParam, MCI_OnInitMenuPopup);
  587.         break;
  588.     case WM_SIZE:
  589.         HANDLE_WM_SIZE(hwnd, wParam, lParam, MCI_OnSize);
  590.         break;
  591.     case WM_DESTROY:
  592.         PostQuitMessage(0);
  593.         return (0);
  594.     }
  595.     return DefFrameProc(hwnd,ghwndMdi,msg,wParam,lParam);
  596. }
  597. /*--------------------------------------------------------------+
  598. | FormatFilterString                                            |
  599. |                                                               |
  600. +--------------------------------------------------------------*/
  601. static BOOL FormatFilterString(
  602. UINT uID,
  603. LPSTR lpszString )
  604. {
  605.     int nLength, nCtr = 0;
  606.     char chWildCard;
  607.     *lpszString = 0;
  608.     nLength = LoadString( ghInstApp, uID, lpszString, BUFSIZE );
  609.     chWildCard = lpszString[nLength-1];
  610.     while( lpszString[nCtr] ) {
  611.         if( lpszString[nCtr] == chWildCard )
  612.             lpszString[nCtr] = 0;
  613.         nCtr++;
  614.     }
  615.     return TRUE;
  616. }