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

Windows编程

开发平台:

Visual C++

  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) 1992 - 1997 Microsoft Corporation.  All Rights Reserved.
  9.  *
  10.  **************************************************************************/
  11. /*--------------------------------------------------------------------
  12. |
  13. | MovPlay2.c - Sample Win app to play AVI movies using mciSendString
  14. |
  15. | Movie Functions supported:
  16. | Play/Pause
  17. | Home/End
  18. | Step/ReverseStep
  19. |
  20. +--------------------------------------------------------------------*/
  21. #define  STRICT
  22. #include <windows.h>
  23. #include <windowsx.h>
  24. #include <commdlg.h>
  25. #include <string.h>
  26. #include <stdlib.h>
  27. #include <stdio.h>
  28. #include <direct.h>
  29. #include <mmsystem.h>
  30. #include <digitalv.h>
  31. #include "movplay.h"
  32. //----------------------------------------------------------------------------
  33. #define BUFSIZE 260
  34. #define MOVPLAY_CLASS "movplay"
  35. #define AVI_VIDEO "avivideo"
  36. #define OPEN_AVI_VIDEO "open avivideo"
  37. #define CLOSE_AVI_VIDEO "close avivideo"
  38. #define MOV_REALIZE "realize mov"
  39. #define MOV_SEEK_TO_START "seek mov to start"
  40. #define MOV_SEEK_TO_END "seek mov to end"
  41. #define MOV_CLOSE "close mov"
  42. #define MOV_SOURCE "where mov source"
  43. #define MOV_OPEN_FORMAT "open %s alias mov style child parent %d"
  44. #define MOV_SHOW "window mov state show"
  45. #define MOV_HANDLE "status mov window handle"
  46. #define MOV_REVERSE "play mov reverse notify"
  47. #define MOV_FORWARD "play mov notify"
  48. #define MOV_PAUSE "pause mov"
  49. #define MOV_FORWARD_STEP "step mov by 1"
  50. #define MOV_REVERSE_STEP "step mov reverse by 1"
  51. //----------------------------------------------------------------------------
  52. //function declarations
  53. LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
  54. BOOL CALLBACK    AboutDlgProc(HWND hwnd, UINT msg, WPARAM wParam,LPARAM lParam);
  55. static BOOL initAVI(void);
  56. static void termAVI(void);
  57. static HWND initApp(HINSTANCE, HINSTANCE, int);
  58. static void menubarUpdate(HWND);
  59. static void titlebarUpdate(HWND hWnd, LPSTR lpstrMovie);
  60. static void positionMovie(HWND);
  61. static void fileCloseMovie(HWND);
  62. static void fileOpenMovie(HWND);
  63. static void playMovie(HWND, int);
  64. static void seekMovie(HWND, int);
  65. static void stepMovie(HWND, int);
  66. static BOOL FormatFilterString(UINT, LPSTR);
  67. static void MovPlay_OnInitMenuPopup(HWND, HMENU, int, BOOL);
  68. static void MovPlay_OnCommand(HWND, int, HWND, UINT);
  69. static void MovPlay_OnSize(HWND, UINT, int, int);
  70. static void MovPlay_OnDestroy(HWND);
  71. //----------------------------------------------------------------------------
  72. //AVI stuff to keep around
  73. HINSTANCE ghInst;
  74. WORD gwMCIDeviceID = 0; /* MCI Device ID for the AVI file */
  75. HWND ghwndMovie; /* window handle of the movie */
  76. BOOL gfPlaying = FALSE; /* Play flag: TRUE == playing, FALSE == paused */
  77. BOOL gfMovieOpen = FALSE;/* Open flag: TRUE == movie open, FALSE = none */
  78. HANDLE ghAccel = NULL; /* accelerator table */
  79. HMENU ghMenuBar = NULL; /* menu bar handle */
  80. char gszBuffer[BUFSIZE];
  81. //----------------------------------------------------------------------------
  82. /*--------------------------------------------------------------+
  83. | initAVI - initialize avi libraries |
  84. | |
  85. +--------------------------------------------------------------*/
  86. static BOOL initAVI(
  87. void)
  88. {
  89. return mciSendString(OPEN_AVI_VIDEO, NULL, 0, NULL) == 0;
  90. }
  91. /*--------------------------------------------------------------+
  92. | termAVI - Closes the opened AVI file and the opened device    |
  93. |           type.                                               |
  94. |                                                               |
  95. +--------------------------------------------------------------*/
  96. void termAVI(
  97. void)
  98. {
  99. mciSendString(CLOSE_AVI_VIDEO, NULL, 0, NULL);
  100. }
  101. /*--------------------------------------------------------------+
  102. | initApp - initialize the app overall. |
  103. | |
  104. | Returns the Window handle for the app on success, NULL if |
  105. | there is a failure. |
  106. | |
  107. +--------------------------------------------------------------*/
  108. HWND initApp(
  109. HINSTANCE hInstance,
  110. HINSTANCE hPrevInstance,
  111. int nCmdShow)
  112. {
  113. HWND hWnd; /* window handle to return */
  114.         char  szAppName[BUFSIZE];
  115.         ghInst = hInstance;
  116. if (!hPrevInstance){
  117. WNDCLASS    wndclass;
  118. wndclass.style = CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW;
  119. wndclass.lpfnWndProc = WndProc;
  120. wndclass.cbClsExtra = 0;
  121. wndclass.cbWndExtra = 0;
  122. wndclass.hInstance = hInstance;
  123. wndclass.hIcon = LoadIcon (hInstance, "AppIcon");
  124. wndclass.hCursor = LoadCursor (NULL, IDC_ARROW);
  125. wndclass.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1);
  126. wndclass.lpszMenuName = MOVPLAY_CLASS;
  127. wndclass.lpszClassName = MOVPLAY_CLASS;
  128. if (!RegisterClass(&wndclass)){
  129.         LoadString( ghInst, IDS_APPERR, szAppName, BUFSIZE );
  130. LoadString( ghInst, IDS_REGCLSFAILED, gszBuffer, BUFSIZE );
  131. MessageBox(NULL, gszBuffer, szAppName, MB_OK);
  132. return NULL;
  133. }
  134. }
  135.         LoadString( ghInst, IDS_APPNAME, szAppName, BUFSIZE );
  136. /* create the main window for the app */
  137. hWnd = CreateWindow(MOVPLAY_CLASS, szAppName, WS_OVERLAPPEDWINDOW |
  138. WS_CLIPCHILDREN, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
  139. CW_USEDEFAULT, NULL, NULL, hInstance, NULL);
  140. if (hWnd == NULL){
  141.         LoadString( ghInst, IDS_APPERR, szAppName, BUFSIZE );
  142. LoadString( ghInst, IDS_CRTWNDFAILED, gszBuffer, BUFSIZE );
  143. MessageBox(NULL, gszBuffer, szAppName, MB_OK);
  144. return NULL;
  145. }
  146. ghMenuBar = GetMenu(hWnd); /* get the menu bar handle */
  147. menubarUpdate(hWnd); /* update menu bar to disable Movie menu */
  148. /* Show the main window */
  149. ShowWindow(hWnd, nCmdShow);
  150. UpdateWindow(hWnd);
  151. /* load the accelerator table */
  152. ghAccel = LoadAccelerators(hInstance, MOVPLAY_CLASS);
  153. return hWnd;
  154. }
  155. /*--------------------------------------------------------------+
  156. | WinMain - main routine. |
  157. | |
  158. +--------------------------------------------------------------*/
  159. int PASCAL WinMain(
  160. HINSTANCE hInstance,
  161. HINSTANCE hPrevInstance,
  162. LPSTR lpszCmdParam,
  163. int nCmdShow)
  164. {
  165. HWND        hWnd;
  166. MSG         msg;
  167. if (!initAVI())
  168. return 0;
  169. if ((hWnd = initApp(hInstance, hPrevInstance, nCmdShow)) == NULL)
  170. return 0; /* died initializing, bail out */
  171. /* main message loop, be sure to handle accelerators */
  172. while (GetMessage(&msg, NULL, 0, 0)){
  173. if (!TranslateAccelerator(hWnd, ghAccel, &msg)) {
  174. TranslateMessage(&msg);
  175. DispatchMessage(&msg);
  176. }
  177. }
  178. return msg.wParam;
  179. }
  180. /*--------------------------------------------------------------+
  181. | MovPlay_OnInitMenuPopup - Message handler for WM_INITMENUPOPUP|
  182. | |
  183. +--------------------------------------------------------------*/
  184. static void MovPlay_OnInitMenuPopup(
  185. HWND hwnd,
  186. HMENU hMenu,
  187. int item,
  188. BOOL fSystemMenu)
  189. {
  190. UINT uEnable;
  191. /* be sure this isn't the system menu */
  192. if (fSystemMenu)
  193. return;
  194. switch (item){
  195. case 0: /* file menu */
  196. /* turn on/off CLOSE & PLAY */
  197. if(gfMovieOpen)
  198. uEnable = MF_ENABLED|MF_BYCOMMAND;
  199. else
  200. uEnable = MF_GRAYED|MF_BYCOMMAND;
  201. EnableMenuItem(hMenu, IDM_CLOSE, uEnable);
  202. break;
  203. case 1: /* Movie menu */
  204. /* check or uncheck the PLAY menu item */
  205. if (gfPlaying)
  206. uEnable = MF_CHECKED|MF_BYCOMMAND;
  207. else
  208. uEnable = MF_UNCHECKED|MF_BYCOMMAND;
  209. CheckMenuItem(hMenu, IDM_PLAY, uEnable);
  210. break;
  211. } /* switch */
  212. return;
  213. }
  214. /*--------------------------------------------------------------+
  215. | MovPlay_OnCommand - Message handler for WM_COMMAND |
  216. |                                                               |
  217. +--------------------------------------------------------------*/
  218. static void MovPlay_OnCommand(
  219. HWND hWnd,
  220. int id,
  221. HWND hwndCtl,
  222. UINT codeNotify)
  223. {
  224. /* handle the menu commands */
  225. switch (id) {
  226.                 case IDM_ABOUT:
  227.                         DialogBox(ghInst, MAKEINTRESOURCE(IDD_ABOUT), hWnd, AboutDlgProc);
  228.                         break;
  229. /* File Menu */
  230. case IDM_OPEN:
  231. fileOpenMovie(hWnd);
  232. break;
  233. case IDM_CLOSE:
  234. fileCloseMovie(hWnd);
  235. break;
  236. case IDM_EXIT:
  237. PostMessage(hWnd, WM_CLOSE, 0, 0L);
  238. break;
  239. /* Movie Menu - note some of these are by */
  240. /* keyboard only, especially the REVERSE  */
  241. /* commands.   */
  242. case IDM_PLAY:
  243. case IDM_RPLAY:
  244. playMovie(hWnd, id);
  245. break;
  246. case IDM_HOME:
  247. case IDM_END:
  248. seekMovie(hWnd, id);
  249. break;
  250. case IDM_STEP:
  251. case IDM_RSTEP:
  252. stepMovie(hWnd,id);
  253. break;
  254. }
  255. return;
  256. }
  257. /*--------------------------------------------------------------+
  258. | MovPlay_OnSize - Message handler for WM_SIZE |
  259. | |
  260. +--------------------------------------------------------------*/
  261. static void MovPlay_OnSize(
  262. HWND hWnd,
  263. UINT state,
  264. int cx,
  265. int cy)
  266. {
  267. positionMovie(hWnd); /* re-center the movie */
  268. return;
  269. }
  270. /*--------------------------------------------------------------+
  271. | MovPlay_OnDestroy - Message handler for WM_DESTROY |
  272. | |
  273. +--------------------------------------------------------------*/
  274. static void MovPlay_OnDestroy(
  275. HWND hWnd)
  276. {
  277. if (gfMovieOpen)
  278. fileCloseMovie(hWnd);
  279. termAVI();
  280. PostQuitMessage(0);
  281. return;
  282. }
  283. /*--------------------------------------------------------------+
  284. | WndProc - window proc for the app |
  285. | |
  286. +--------------------------------------------------------------*/
  287. LRESULT CALLBACK WndProc(
  288. HWND hWnd,
  289. UINT message,
  290. WPARAM wParam,
  291. LPARAM lParam)
  292. {
  293. switch (message){
  294. case WM_INITMENUPOPUP:
  295. return HANDLE_WM_INITMENUPOPUP(hWnd, wParam, lParam, MovPlay_OnInitMenuPopup);
  296. break;
  297. case WM_COMMAND:
  298. return HANDLE_WM_COMMAND(hWnd, wParam, lParam, MovPlay_OnCommand);
  299. break;
  300. case WM_SIZE:
  301. return HANDLE_WM_SIZE(hWnd, wParam, lParam, MovPlay_OnSize);
  302. break;
  303. case WM_DESTROY:
  304. return HANDLE_WM_DESTROY(hWnd, wParam, lParam, MovPlay_OnDestroy);
  305. break;
  306.         // We need to realize the AVI's palette
  307. case WM_QUERYNEWPALETTE:
  308. case WM_PALETTECHANGED:
  309. case WM_ACTIVATE:
  310.             mciSendString(MOV_REALIZE, NULL, 0, NULL);
  311.     break;
  312. case MM_MCINOTIFY:
  313. /* This is where we check the status of an AVI */
  314. /* movie that might have been playing.  We do */
  315. /* the play with MCI_NOTIFY on so we should get */
  316. /* a MCI_NOTIFY_SUCCESSFUL if the play */
  317. /* completes on it's own. */
  318. switch(wParam){
  319. case MCI_NOTIFY_SUCCESSFUL:
  320. /* the play finished, let's rewind */
  321. /* and clear our flag.    */
  322. gfPlaying = FALSE;
  323. mciSendString(MOV_SEEK_TO_START, NULL, 0, NULL);
  324. return 0;
  325. }
  326. } /* switch */
  327. return DefWindowProc(hWnd, message, wParam, lParam);
  328. }
  329. /*--------------------------------------------------------------+
  330. | menubarUpdate - update the menu bar based on the <gfMovieOpen> |
  331. |   flag value.  This will turn on/off the |
  332. |   Movie menu. |
  333. | |
  334. +--------------------------------------------------------------*/
  335. static void menubarUpdate(
  336. HWND hWnd)
  337. {
  338. WORD w;
  339. if (gfMovieOpen){
  340. w = MF_ENABLED|MF_BYPOSITION;
  341. } else {
  342. w = MF_GRAYED|MF_BYPOSITION;
  343. }
  344. EnableMenuItem(ghMenuBar, 1, w); /* change the Movie menu (#1) */
  345. DrawMenuBar(hWnd); /* re-draw the menu bar */
  346. }
  347. /*--------------------------------------------------------------+
  348. | titlebarUpdate - update the title bar to include the name |
  349. |    of the movie playing. |
  350. | |
  351. +--------------------------------------------------------------*/
  352. static void titlebarUpdate(
  353. HWND hWnd,
  354. LPSTR lpstrMovie)
  355. {
  356. char szNewTitle[2*BUFSIZE]; // space for the title
  357. char szAppName[BUFSIZE];
  358. LoadString( ghInst, IDS_APPNAME, szAppName, BUFSIZE );
  359. if (lpstrMovie != NULL)
  360. wsprintf(szNewTitle,"%s - %s", (LPSTR)szAppName,(LPSTR)lpstrMovie);
  361. else
  362. lstrcpy(szNewTitle, szAppName);
  363. SetWindowText(hWnd, szNewTitle);
  364. }
  365. /*--------------------------------------------------------------+
  366. | positionMovie - sets the movie rectange <rcMovie> to be |
  367. | centered within the app's window. |
  368. | |
  369. +--------------------------------------------------------------*/
  370. static VOID positionMovie(
  371. HWND hWnd)
  372. {
  373. RECT rcMovie;
  374. RECT rcClient;
  375. RECT rcMovieBounds;
  376. char achRect[128];
  377. char *p;
  378. /* if there is no movie yet then just get out of here */
  379. if (!gfMovieOpen)
  380. return;
  381. GetClientRect(hWnd, &rcClient); /* get the parent windows rect */
  382. /* get the original size of the movie */
  383. mciSendString(MOV_SOURCE, achRect, sizeof(achRect), NULL);
  384. SetRectEmpty(&rcMovieBounds); // zero out movie rect
  385. p = achRect; // point to rectangle string returned by where command
  386. while (*p == ' ') p++; // skip over starting spaces
  387. while (*p != ' ') p++; // skip over the x (which is 0)
  388. while (*p == ' ') p++; // skip over spaces between x and y
  389. while (*p != ' ') p++; // skip over the y (which is 0)
  390. while (*p == ' ') p++; // skip over the spaces between y and width
  391. /* now find the width */
  392. for (; *p >= '0' && *p <= '9'; p++)
  393. rcMovieBounds.right = (10 * rcMovieBounds.right) + (*p - '0');
  394. while (*p == ' ') p++; // skip spaces between width and height
  395. /* now find the height */
  396. for (; *p >= '0' && *p <= '9'; p++)
  397. rcMovieBounds.bottom = (10 * rcMovieBounds.bottom) + (*p - '0');
  398. /* figure out where to position the window at */
  399. rcMovie.left = (rcClient.right/2) - (rcMovieBounds.right / 2);
  400. rcMovie.top = (rcClient.bottom/2) - (rcMovieBounds.bottom / 2);
  401. rcMovie.right = rcMovie.left + rcMovieBounds.right;
  402. rcMovie.bottom = rcMovie.top + rcMovieBounds.bottom;
  403. /* reposition the playback (child) window */
  404. MoveWindow(ghwndMovie, rcMovie.left, rcMovie.top,
  405. rcMovieBounds.right, rcMovieBounds.bottom, TRUE);
  406. }
  407. /*--------------------------------------------------------------+
  408. | fileCloseMovie - close the movie and anything associated |
  409. |    with it. |
  410. | |
  411. | This function clears the <gfPlaying> and <gfMovieOpen> flags |
  412. | |
  413. +--------------------------------------------------------------*/
  414. static void fileCloseMovie(HWND hWnd)
  415. {
  416. mciSendString(MOV_CLOSE, NULL, 0, NULL);
  417. gfPlaying = FALSE; // can't be playing any longer
  418. gfMovieOpen = FALSE; // no more movies open
  419. titlebarUpdate(hWnd, NULL); // title bar back to plain
  420. menubarUpdate(hWnd); // update menu bar
  421. /* cause a total repaint to occur */
  422. InvalidateRect(hWnd, NULL, TRUE);
  423. UpdateWindow(hWnd);
  424. }
  425. /*--------------------------------------------------------------+
  426. | fileOpenMovie - open an AVI movie. Use CommDlg open box to |
  427. |         open and then handle the initialization to |
  428. | show the movie and position it properly.  Keep |
  429. | the movie paused when opened. |
  430. | |
  431. | Sets <gfMovieOpened> on success. |
  432. +--------------------------------------------------------------*/
  433. static void fileOpenMovie(
  434. HWND hWnd)
  435. {
  436. OPENFILENAME ofn;
  437. static char szFile [BUFSIZE];
  438. static char szFileTitle [BUFSIZE];
  439. static int  nLastFilter = 1;   /* keep last file-type opened */
  440. static char szFilter [BUFSIZE];
  441. FormatFilterString( IDS_FILTERSTRING, szFilter );
  442. /* use the OpenFile dialog to get the filename */
  443. memset(&ofn, 0, sizeof(ofn));
  444. ofn.lStructSize = sizeof(ofn);
  445. ofn.hwndOwner = hWnd;
  446. ofn.lpstrFilter = szFilter;
  447. ofn.nFilterIndex = nLastFilter;
  448. ofn.lpstrFile = szFile;
  449. ofn.nMaxFile = sizeof(szFile);
  450. ofn.lpstrFileTitle = szFileTitle;
  451. ofn.nMaxFileTitle = sizeof(szFileTitle);
  452. ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
  453. /* use CommDlg to get our filename */
  454. if (GetOpenFileName(&ofn)){
  455. char szCommand[BUFSIZE];
  456. DWORD  dw;
  457. /* we got a filename, now close any old movie and open */
  458. /* the new one. */
  459. if (gfMovieOpen)
  460. fileCloseMovie(hWnd);
  461. /* we have a .AVI movie to open, use MCI */
  462. /*
  463. | build up the string -
  464. | open alias mov parent HWND FILENAME
  465. | to pass to mciSendString
  466. */
  467. wsprintf(szCommand,MOV_OPEN_FORMAT, (LPSTR)ofn.lpstrFile, (int)hWnd);
  468. /* try to open the file */
  469. if (mciSendString(szCommand, NULL, 0, NULL) == 0){
  470. gfMovieOpen = TRUE;
  471. /* we opened the file o.k., now set up to */
  472. /* play it.    */
  473. mciSendString(MOV_SHOW, NULL, 0, NULL);
  474. /* get the window handle */
  475. if ((dw = mciSendString(MOV_HANDLE, szCommand, sizeof(szCommand),
  476. NULL)) == 0L)
  477. ghwndMovie = (HWND)atoi(szCommand);
  478. else {
  479. mciGetErrorString(dw, szCommand, sizeof(szCommand));
  480. MessageBox(hWnd, szCommand, NULL, MB_ICONEXCLAMATION|MB_OK);
  481. }
  482. /* now get the movie centered */
  483. positionMovie(hWnd);
  484. } else {
  485. /* generic error for open */
  486. LoadString( ghInst, IDS_NOOPEN, gszBuffer, BUFSIZE );
  487. MessageBox(hWnd, gszBuffer, NULL, MB_ICONEXCLAMATION|MB_OK);
  488. gfMovieOpen = FALSE;
  489. }
  490. }
  491. /* update menu and title bars */
  492. if (gfMovieOpen)
  493. titlebarUpdate(hWnd, (LPSTR)ofn.lpstrFileTitle);
  494. else
  495. titlebarUpdate(hWnd, NULL);
  496. menubarUpdate(hWnd);
  497. /* cause an update to occur */
  498. InvalidateRect(hWnd, NULL, FALSE);
  499. UpdateWindow(hWnd);
  500. }
  501. /*--------------------------------------------------------------+
  502. | playMovie - play/pause the movie depending on the state |
  503. | of the <gfPlaying> flag. |
  504. | |
  505. | This function sets the <gfPlaying> flag appropriately when done|
  506. | |
  507. +--------------------------------------------------------------*/
  508. static void playMovie(
  509. HWND hWnd,
  510. int nDirection)
  511. {
  512. gfPlaying = !gfPlaying; /* swap the play flag */
  513. if(!nDirection)
  514. gfPlaying = FALSE; /* nDirection == NULL means PAUSE */
  515. /* play/pause the AVI movie */
  516. if (gfPlaying){
  517. if (nDirection == IDM_RPLAY){
  518. mciSendString(MOV_REVERSE, NULL, 0, hWnd);
  519. } else {
  520. mciSendString(MOV_FORWARD, NULL, 0, hWnd);
  521. }
  522. } else {
  523. /* tell it to pause */
  524. mciSendString(MOV_PAUSE, NULL, 0, NULL);
  525. }
  526. }
  527. /*--------------------------------------------------------------+
  528. | seekMovie - seek in the movie depending on the wAction. |
  529. |       Possible actions are IDM_HOME (start of movie) or |
  530. |       IDM_END (end of movie) |
  531. | |
  532. |       Always stop the play before seeking. |
  533. | |
  534. +--------------------------------------------------------------*/
  535. static void seekMovie(
  536. HWND hWnd,
  537. int nAction)
  538. {
  539. /* first stop the movie from playing if it is playing */
  540. if (gfPlaying){
  541. playMovie(hWnd, 0);
  542. }
  543. if (nAction == IDM_HOME){
  544. /* home the movie */
  545. mciSendString(MOV_SEEK_TO_START, NULL, 0, NULL);
  546. } else if (nAction == IDM_END){
  547. /* go to the end of the movie */
  548. mciSendString(MOV_SEEK_TO_END, NULL, 0, NULL);
  549. }
  550. }
  551. /*--------------------------------------------------------------+
  552. | stepMovie - step forward or reverse in the movie.  wDirection |
  553. | can be IDM_STEP (forward) or IDM_RSTEP (reverse)|
  554. | |
  555. | Again, stop the play if one is in progress. |
  556. | |
  557. +--------------------------------------------------------------*/
  558. static void stepMovie(
  559. HWND hWnd,
  560. int nDirection)
  561. {
  562. if (gfPlaying)
  563. playMovie(hWnd, 0);  /* turn off the movie */
  564. if (nDirection == IDM_STEP)
  565. mciSendString(MOV_FORWARD_STEP, NULL, 0, NULL);
  566. else
  567. mciSendString(MOV_REVERSE_STEP, NULL,0, NULL);
  568. }
  569. /*--------------------------------------------------------------+
  570. | FormatFilterString  |
  571. | |
  572. +--------------------------------------------------------------*/
  573. static BOOL FormatFilterString(
  574. UINT uID,
  575. LPSTR lpszString )
  576. {
  577. int nLength, nCtr = 0;
  578. char chWildCard;
  579. *lpszString = 0;
  580. nLength = LoadString( ghInst, uID, lpszString, BUFSIZE );
  581. chWildCard = lpszString[nLength-1];
  582. while( lpszString[nCtr] ) {
  583. if( lpszString[nCtr] == chWildCard )
  584. lpszString[nCtr] = 0;
  585. nCtr++;
  586. }
  587. return TRUE;
  588. }
  589. /* AboutDlgProc()
  590.  *
  591.  * Dialog Procedure for the "about" dialog box.
  592.  *
  593.  */
  594. BOOL CALLBACK AboutDlgProc(
  595. HWND hwnd,
  596. UINT msg,
  597. WPARAM wParam,
  598. LPARAM lParam)
  599. {
  600. switch (msg) {
  601. case WM_COMMAND:
  602. EndDialog(hwnd, TRUE);
  603. return TRUE;
  604. case WM_INITDIALOG:
  605. return TRUE;
  606. }
  607. return FALSE;
  608. }