home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / msdn_vcb / samples / vc98 / sdk / graphics / audio / soundapp / soundapp.c < prev    next >
C/C++ Source or Header  |  1997-10-05  |  15KB  |  502 lines

  1. /**************************************************************************
  2.  *
  3.  *    SOUNDAPP:
  4.  *
  5.  *    A sample app showing the sndPlaySound API
  6.  *
  7.  **************************************************************************
  8.  *
  9.  *  THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
  10.  *  KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
  11.  *  IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR
  12.  *  PURPOSE.
  13.  *
  14.  *  Copyright (C) 1994 - 1997  Microsoft Corporation.  All Rights Reserved.
  15.  *
  16.  **************************************************************************/
  17. #pragma warning(disable: 4001)
  18. #define __SOUNDAPP_C
  19. #define Unused(var)    (var=var)
  20.  
  21. // header dependancies 
  22. #include <windows.h>
  23. #include <mmsystem.h>
  24. #include <commdlg.h>
  25. #include <windowsx.h>
  26. #include "resource.h"
  27.  
  28. //message cracker prototypes 
  29. void SoundApp_OnActivate(HWND hwnd, UINT state, HWND hwndActDeact, BOOL fMinimized);
  30. void SoundApp_OnDestroy(HWND hwnd);
  31. void SoundApp_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify);
  32. BOOL About_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam);
  33. BOOL About_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify);
  34.  
  35. //function prototypes 
  36. long PASCAL WndProc (HWND, UINT, UINT, LONG);
  37. BOOL CALLBACK AboutDlgProc(HWND hdlg, UINT mMsg, WPARAM wParam, LPARAM lParam);
  38. LRESULT AboutDlgProc2(HWND hdlg, UINT mMsg,    WPARAM wParam, LPARAM lParam);
  39.  
  40. //global variables 
  41. HANDLE hInst;
  42. BOOL bRecursing = FALSE;
  43.  
  44. ////////////////////////////////////////////////////////////////////////////////
  45. //WinMain
  46. //
  47. //Purpose: The main procedure
  48. //
  49. //Parameters: HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdParam, 
  50. //int nCmdShow
  51. //
  52. //Returns: int
  53. ////////////////////////////////////////////////////////////////////////////////// 
  54. int PASCAL WinMain (
  55.     HINSTANCE hInstance, 
  56.     HINSTANCE hPrevInstance,
  57.     LPSTR lpszCmdParam, 
  58.     int nCmdShow)
  59.  
  60.     {
  61.     static char szAppName[] = "SoundApp";
  62.     HWND        hwnd;
  63.     MSG         msg;
  64.     WNDCLASS    wndclass;
  65.  
  66.     Unused(lpszCmdParam);
  67.  
  68.     if (!hPrevInstance)
  69.         {
  70.         wndclass.style         = CS_HREDRAW | CS_VREDRAW;
  71.         wndclass.lpfnWndProc   = WndProc;
  72.         wndclass.cbClsExtra    = 0 ;
  73.         wndclass.cbWndExtra    = DLGWINDOWEXTRA;
  74.         wndclass.hInstance     = hInstance;
  75.         wndclass.hIcon         = LoadIcon (hInstance, "IDI_SOUNDAPP");
  76.         wndclass.hCursor       = LoadCursor (NULL, IDI_APPLICATION);
  77.         wndclass.hbrBackground = GetStockObject(WHITE_BRUSH);
  78.         wndclass.lpszMenuName  = NULL;
  79.         wndclass.lpszClassName = szAppName;
  80.  
  81.         RegisterClass (&wndclass);
  82.         }
  83.  
  84.     hInst = hInstance;
  85.     hwnd = CreateDialog(hInstance, "SoundApp", 0, NULL);
  86.     CreateDialog(hInstance, "ID_SOUNDAPP_ABOUT", hwnd, NULL);
  87.     ShowWindow (hwnd, nCmdShow);
  88.  
  89.     while (GetMessage (&msg, NULL, 0, 0))
  90.         {
  91.         TranslateMessage (&msg);
  92.         DispatchMessage (&msg);
  93.         }
  94.     return msg.wParam;
  95.     }
  96.  
  97. /////////////////////////////////////////////////////////////////////////
  98. //WndProc
  99. //
  100. //Purpose: The window procedure
  101. //
  102. //Parameters: HWND hwnd, UINT message, UINT wParam, LONG lParam
  103. //
  104. //Returns: long
  105. ///////////////////////////////////////////////////////////////////////////  
  106. long PASCAL WndProc (
  107.     HWND hwnd, 
  108.     UINT message, 
  109.     UINT wParam, 
  110.     LONG lParam)
  111.  
  112.     {
  113.     switch (message)
  114.         {
  115.         HANDLE_MSG(hwnd, WM_DESTROY, SoundApp_OnDestroy);
  116.         HANDLE_MSG(hwnd, WM_ACTIVATE, SoundApp_OnActivate);
  117.         HANDLE_MSG(hwnd, WM_COMMAND, SoundApp_OnCommand);
  118.         default:
  119.             return DefWindowProc (hwnd, message, wParam, lParam);
  120.         }
  121.     }
  122.  
  123. //////////////////////////////////////////////////////////////////////
  124. //SoundApp_OnActivate
  125. //
  126. //Purpose: processes a WM_ACTIVATE message
  127. //Initializes controls in the dialog the first time it is activated:
  128. //Checks Synchronous, disables Loop and Stop, and gets default sound
  129. //from win.ini or registry. 
  130. //
  131. //Parameters: HWND hwnd, UINT state, HWND hwndActDeact, BOOL fMinimized
  132. //
  133. //Returns: void
  134. //////////////////////////////////////////////////////////////////////
  135. void SoundApp_OnActivate(
  136.     HWND hwnd,
  137.     UINT state,
  138.     HWND hwndActDeact,
  139.     BOOL fMinimized)
  140.  
  141.     {
  142.     static BOOL fFirstTime = TRUE;
  143.     HMENU hMenu;
  144.     char SoundBuff[256];
  145.     int i=0;
  146.  
  147.     if (fFirstTime)
  148.         {
  149.         hMenu = GetMenu(hwnd);
  150.         SendMessage(GetDlgItem(hwnd, IDC_SYNC), BM_SETCHECK, 1, 0);
  151.         CheckMenuItem(hMenu, ID_OPTIONS_SYNC,MF_CHECKED);
  152.         EnableWindow(GetDlgItem(hwnd, IDC_LOOP), FALSE);            
  153.         EnableMenuItem(hMenu, ID_OPTIONS_LOOP, MF_DISABLED | MF_GRAYED);
  154.         EnableWindow(GetDlgItem(hwnd, IDC_BUTTON_STOP), FALSE);
  155.         GetProfileString("Sounds", "SystemDefault", ",Default", SoundBuff, 256);
  156.         //get rid of everything after the filename
  157.         while(SoundBuff[i] != ',' && i<255)
  158.             {
  159.             i++;
  160.             }
  161.         SoundBuff[i] = 0;
  162.         SendMessage(GetDlgItem(hwnd, IDC_EDIT_FILE), WM_SETTEXT, 0, (LPARAM)SoundBuff);
  163.         fFirstTime = FALSE;        
  164.         } 
  165.     }
  166.  
  167.  
  168. //////////////////////////////////////////////////////////////////////
  169. //SoundApp_OnDestroy
  170. //
  171. //Purpose: processes a WM_DESTROY message
  172. //
  173. //Parameters: handle to the main window
  174. //
  175. //Returns: void  
  176. //////////////////////////////////////////////////////////////////////
  177. void SoundApp_OnDestroy(HWND hwnd)
  178.     {
  179.     PostQuitMessage (0);
  180.     }
  181.  
  182.  
  183. ///////////////////////////////////////////////////////////////////////
  184. //SoundApp_OnCommand
  185. //
  186. //Purpose: processes a WM_COMMAND message
  187. //details below for each command.
  188. //
  189. //Parameters: HWND hwnd, int id, HWND hwndCtl, UINT codeNotify
  190. //
  191. //Returns: void  
  192. ///////////////////////////////////////////////////////////////////////
  193. void SoundApp_OnCommand(
  194.     HWND hwnd,
  195.     int id,
  196.     HWND hwndCtl,
  197.     UINT codeNotify)
  198.  
  199.     {
  200.     static LPCTSTR lpszSoundName = NULL;    //name of the sound to play    
  201.     static UINT uFlags = SND_SYNC;            //option flags for sndPlaySound    
  202.     HWND hButton;
  203.     HMENU hMenu;
  204.     LRESULT nCheckState;
  205.     char SoundBuff[256];
  206.     static fFirstTime = TRUE;
  207.  
  208.     OPENFILENAME ofn;       // common dialog box structure 
  209.     char szDirName[256];    // directory string 
  210. static    char szFile[256];       // filename string 
  211.     char szFileTitle[256];  // file-title string 
  212.     char szFilter[256];     // filter string 
  213.     char chReplace;         // string separator for szFilter 
  214.     int i, cbString;        // integer count variables 
  215.     char szSelectFile[256];    // title of select file dialog 
  216.  
  217.     //first get default sound name from win.ini or registry 
  218.     if (fFirstTime)
  219.         {
  220.         GetProfileString("Sounds", "SystemDefault", ",Default", SoundBuff, 256);
  221.         //get rid of everything after the filename in the ini string
  222.         i=0;
  223.         while(SoundBuff[i] != ',' && i<255)
  224.             {
  225.             i++;
  226.             }
  227.         SoundBuff[i] = 0;
  228.         if (i == 0)
  229.             {
  230.             lpszSoundName = NULL;
  231.             }
  232.         else
  233.             {
  234.             lpszSoundName = SoundBuff;
  235.             } 
  236.         fFirstTime = FALSE;
  237.         }
  238.     hMenu = GetMenu(hwnd);
  239.  
  240.     //if File|Exit is selected, quit
  241.     if(id == ID_FILE_EXIT)
  242.         {
  243.         PostQuitMessage (0);
  244.         }
  245.  
  246.     //if Play button is clicked, play sound
  247.     if(id == IDC_BUTTON_PLAY)
  248.         {   
  249.         sndPlaySound(lpszSoundName, uFlags);
  250.         }
  251.  
  252.     //if Stop button is pushed, stop playing sound
  253.     if(id == IDC_BUTTON_STOP)
  254.         {
  255.         sndPlaySound(NULL, SND_SYNC);
  256.         }
  257.  
  258.     //if File|Select File or the Select File button is selected, show the
  259.     //file open dialog and get the name of the file to play
  260.     if(id == ID_FILE_SELECT || id == IDC_BUTTON_OPEN)
  261.         {
  262.         //Set up structure for file dialog
  263.         GetWindowsDirectory(szDirName, sizeof(szDirName));
  264.         szFile[0] = '\0';
  265.         LoadString(NULL, IDS_SELECT_FILE, szSelectFile, sizeof(szSelectFile));
  266.         cbString = LoadString(NULL, IDS_FILTERSTRING, szFilter, sizeof(szFilter));
  267.         chReplace = szFilter[cbString - 1];
  268.         for (i = 0; szFilter[i] != '\0'; i++)
  269.             {
  270.             if (szFilter[i] == chReplace)
  271.                 szFilter[i] = '\0';
  272.             }
  273.  
  274.         ofn.lStructSize = sizeof(OPENFILENAME);
  275.         ofn.hwndOwner = hwnd;
  276.         ofn.lpstrFilter = szFilter;
  277.         ofn.lpstrCustomFilter = NULL;
  278.         ofn.nFilterIndex = 1;
  279.         ofn.lpstrFile = szFile;
  280.         ofn.nMaxFile = sizeof(szFile);
  281.         ofn.lpstrFileTitle = szFileTitle;
  282.         ofn.nMaxFileTitle = sizeof(szFileTitle);
  283.         ofn.lpstrInitialDir = szDirName;
  284.         ofn.lpstrTitle = szSelectFile;
  285.         ofn.lpstrDefExt = NULL;                
  286.         ofn.Flags = OFN_SHAREAWARE | OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
  287.  
  288.         //Put up Open File dialog to get filename  
  289.         if (GetOpenFileName(&ofn)) 
  290.             {
  291.             lpszSoundName = ofn.lpstrFile;
  292.             hButton = GetDlgItem(hwnd, IDC_EDIT_FILE);
  293.             SendMessage(hButton, WM_SETTEXT, 0, (LPARAM)ofn.lpstrFileTitle);
  294.             }       
  295.         }
  296.  
  297.     //if Help|About is selected, show the About SoundApp dialog
  298.     if(id == ID_HELP_ABOUT)
  299.         {
  300.         FARPROC lpfnAbout;
  301.  
  302.         lpfnAbout = MakeProcInstance((FARPROC)AboutDlgProc, hInst);
  303.         DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG_ABOUT), hwnd, (DLGPROC)lpfnAbout);
  304.         FreeProcInstance(lpfnAbout);
  305.         }
  306.  
  307.     //if Options|Sync or the Sync button is selected, set checks and flags
  308.     if(id == IDC_SYNC || id == ID_OPTIONS_SYNC)
  309.         {
  310.         hButton = GetDlgItem(hwnd, IDC_SYNC);
  311.         nCheckState = SendMessage(hButton, BM_GETCHECK, 0, 0);
  312.         //if Synchronous ws unchecked
  313.         if (nCheckState == 0)
  314.             {
  315.             //check Synchronous checkbox, uncheck Asynchronous checkbox,
  316.             //check Synchronous menu, uncheck Asynchronous menu,
  317.             //uncheck Loop checkbox and menu,
  318.             //disable Loop checkbox and menu,
  319.             //disable Stop button, and set sndPlaySound flags. 
  320.             SendMessage(hButton, BM_SETCHECK, 1, 0);                       
  321.             SendMessage(GetDlgItem(hwnd, IDC_ASYNC),BM_SETCHECK, 0, 0);
  322.             CheckMenuItem(hMenu, ID_OPTIONS_SYNC,MF_CHECKED);               
  323.             CheckMenuItem(hMenu, ID_OPTIONS_ASYNC, MF_UNCHECKED);         
  324.             SendMessage(GetDlgItem(hwnd, IDC_LOOP), BM_SETCHECK, 0, 0);    
  325.             CheckMenuItem(hMenu, ID_OPTIONS_LOOP,MF_UNCHECKED);               
  326.             EnableWindow(GetDlgItem(hwnd, IDC_LOOP), FALSE);            
  327.             EnableMenuItem(hMenu, ID_OPTIONS_LOOP, MF_DISABLED | MF_GRAYED);
  328.             EnableWindow(GetDlgItem(hwnd, IDC_BUTTON_STOP), FALSE);        
  329.             uFlags = uFlags & ~SND_ASYNC & ~SND_LOOP;                    
  330.             }
  331.         }
  332.  
  333.     //if Options|Async or the Async button is selected, set checks and flags
  334.     if(id == IDC_ASYNC || id == ID_OPTIONS_ASYNC)
  335.         {
  336.         hButton = GetDlgItem(hwnd, IDC_ASYNC);
  337.         nCheckState = SendMessage(hButton, BM_GETCHECK, 0, 0);
  338.         //if Asynchronous was unchecked
  339.         if (nCheckState == 0)
  340.             {
  341.             //check Asynchronous checkbox, uncheck Synchronous checkbox,
  342.             //check Asynchronous menu, uncheck Synchronous menu,
  343.             //enable Loop checkbox and menu,
  344.             //enable Stop button, and set sndPlaySound flags. 
  345.             SendMessage(hButton, BM_SETCHECK, 1, 0);                    
  346.             SendMessage(GetDlgItem(hwnd, IDC_SYNC),BM_SETCHECK, 0, 0);
  347.             CheckMenuItem(hMenu, ID_OPTIONS_ASYNC,MF_CHECKED);             
  348.             CheckMenuItem(hMenu, ID_OPTIONS_SYNC, MF_UNCHECKED);         
  349.             EnableWindow(GetDlgItem(hwnd, IDC_LOOP), TRUE);                
  350.             EnableMenuItem(hMenu, ID_OPTIONS_LOOP, MF_ENABLED);             
  351.             EnableWindow(GetDlgItem(hwnd, IDC_BUTTON_STOP), TRUE);        
  352.             uFlags = uFlags | SND_ASYNC;                                
  353.             }
  354.         }
  355.  
  356.     //if Options|NoDefault or the NoDefault button is selected, set checks and flags
  357.     if(id == ID_OPTIONS_NODEFAULT || id == IDC_NODEFAULT)
  358.         { 
  359.         hButton = GetDlgItem(hwnd, IDC_NODEFAULT);
  360.         nCheckState = SendMessage(hButton, BM_GETCHECK, 0, 0);
  361.         //if NoDefault was unchecked
  362.         if (nCheckState == 0)
  363.             {
  364.             //check NoDefault checkbox and menu, and set sndPlaySound flags. 
  365.             SendMessage(hButton, BM_SETCHECK, 1, 0);                    
  366.             CheckMenuItem(hMenu, ID_OPTIONS_NODEFAULT, MF_CHECKED);     
  367.             uFlags = uFlags | SND_NODEFAULT;
  368.             }
  369.         else
  370.             {
  371.             //uncheck NoDefault checkbox and menu, and set sndPlaySound flags. 
  372.             SendMessage(hButton, BM_SETCHECK, 0, 0);                    
  373.             CheckMenuItem(hMenu, ID_OPTIONS_NODEFAULT, MF_UNCHECKED);     
  374.             uFlags = uFlags    & ~SND_NODEFAULT;
  375.             }
  376.         }
  377.  
  378.     //if Options|Loop or the Loop button is selected, set checks and flags
  379.     if(id == ID_OPTIONS_LOOP ||    id == IDC_LOOP)
  380.         {
  381.         hButton = GetDlgItem(hwnd, IDC_LOOP);
  382.         nCheckState = SendMessage(hButton, BM_GETCHECK, 0, 0);
  383.         //if Loop was unchecked
  384.         if (nCheckState == 0)
  385.             {
  386.             //check Loop checkbox and menu, and set sndPlaySound flags.    
  387.             SendMessage(hButton, BM_SETCHECK, 1, 0);                    
  388.             CheckMenuItem(hMenu, ID_OPTIONS_LOOP,MF_CHECKED);           
  389.             uFlags = uFlags | SND_LOOP;
  390.             }
  391.         else
  392.             {
  393.             //uncheck Loop checkbox and menu, and set sndPlaySound flags. 
  394.             SendMessage(hButton, BM_SETCHECK, 0, 0);                    
  395.             CheckMenuItem(hMenu, ID_OPTIONS_LOOP,MF_UNCHECKED);          
  396.             uFlags = uFlags    & ~SND_LOOP;
  397.             }
  398.         }
  399.  
  400.     //if Options|NoStop or the NoStop button is selected, set checks and flags
  401.     if(id == ID_OPTIONS_NOSTOP || id == IDC_NOSTOP)
  402.         {
  403.         hButton = GetDlgItem(hwnd, IDC_NOSTOP);
  404.         nCheckState = SendMessage(hButton, BM_GETCHECK, 0, 0);
  405.         //if NoStop was unchecked
  406.         if (nCheckState == 0)
  407.             {
  408.             //check NoStop checkbox and menu, and set sndPlaySound flags. 
  409.             SendMessage(hButton, BM_SETCHECK, 1, 0);                    
  410.             CheckMenuItem(hMenu, ID_OPTIONS_NOSTOP,MF_CHECKED);               
  411.             uFlags = uFlags | SND_NOSTOP;
  412.             }
  413.         else
  414.             {
  415.             //uncheck NoStop checkbox and menu, and set sndPlaySound flags.    
  416.             SendMessage(hButton, BM_SETCHECK, 0, 0);                    
  417.             CheckMenuItem(hMenu, ID_OPTIONS_NOSTOP,MF_UNCHECKED);          
  418.             uFlags = uFlags    & ~SND_NOSTOP;
  419.             }
  420.         }
  421.     }                           
  422.               
  423. /////////////////////////////////////////////////////////////////////////////
  424. //AboutDlgProc
  425. //
  426. //Purpose: Calls AboutDlgProc2
  427. //This makes it possible to use messge crackers in the dialog procedure
  428. //
  429. //Parameters:HWND hdlg, UINT mMsg, WPARAM wParam, LPARAM lParam
  430. //
  431. //Returns: BOOL
  432. ///////////////////////////////////////////////////////////////////////////////
  433. BOOL CALLBACK AboutDlgProc(
  434.     HWND hdlg,
  435.     UINT mMsg,
  436.     WPARAM wParam,
  437.     LPARAM lParam)
  438.  
  439.     {
  440.     CheckDefDlgRecursion(&bRecursing);
  441.     return(SetDlgMsgResult(hdlg, mMsg, AboutDlgProc2(hdlg, mMsg, wParam, lParam)));
  442.     }
  443.  
  444. /////////////////////////////////////////////////////////////////////////////
  445. //AboutDlgProc2
  446. //
  447. //Purpose: handle messages to the About dialog
  448. //
  449. //Parameters: HWND hdlg, UINT mMsg, WPARAM wParam, LPARAM lParam
  450. //
  451. //Returns: LRESULT
  452. ///////////////////////////////////////////////////////////////////////////////
  453. LRESULT AboutDlgProc2(
  454.     HWND hdlg,
  455.     UINT mMsg,
  456.     WPARAM wParam,
  457.     LPARAM lParam)
  458.  
  459.     {
  460.     switch(mMsg)
  461.         {
  462.         HANDLE_MSG(hdlg, WM_INITDIALOG, About_OnInitDialog);
  463.         HANDLE_MSG(hdlg, WM_COMMAND, About_OnCommand);
  464.         default:
  465.             return(DefDlgProcEx(hdlg, mMsg, wParam, lParam, &bRecursing));
  466.         }
  467.     }
  468.  
  469. /////////////////////////////////////////////////////////////////////////
  470. //About_OnInitDialog
  471. //
  472. //Purpose: Initialize About dialog. Set focus to the OK button.
  473. //
  474. //Parameters: HWND hdlg, HWND hwndFocus, LPARAM lParam
  475. //
  476. //Returns: TRUE
  477. //////////////////////////////////////////////////////////////////////
  478. BOOL About_OnInitDialog(HWND hdlg, HWND hwndFocus, LPARAM lParam)
  479.     {
  480.     SetFocus(GetDlgItem(hdlg, IDOK));
  481.     return TRUE;
  482.     }
  483.     
  484. /////////////////////////////////////////////////////////////////////////
  485. //About_OnCommand
  486. //
  487. //Purpose: Closes the About dialog when the OK button is clicked
  488. //
  489. //Parameters: HWND hdlg, int id, HWND hwndCtl, UINT codeNotify
  490. //
  491. //Returns: BOOL
  492. //////////////////////////////////////////////////////////////////////
  493. BOOL About_OnCommand(HWND hdlg, int id, HWND hwndCtl, UINT codeNotify)
  494.     {    
  495.     if(id == IDOK)
  496.         {
  497.         EndDialog(hdlg, TRUE);
  498.         return TRUE;
  499.         }
  500.     return FALSE;
  501.     }
  502.