home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 2001 June / VPR0106A.BIN / OLS / TCL228 / TCL228.lzh / EXESRC.lzh / pagealarm.c < prev    next >
C/C++ Source or Header  |  1999-09-18  |  17KB  |  631 lines

  1. /*-------------------------------------------
  2.   pagealarm.c
  3.   「アラーム」プロパティページ
  4.   KAZUBON 1997-1998
  5. ---------------------------------------------*/
  6.  
  7. #include "tclock.h"
  8.  
  9. static void OnInit(HWND hDlg);
  10. static void OnApply(HWND hDlg);
  11. static void OnChangeAlarm(HWND hDlg);
  12. static void OnChangeTime(HWND hDlg);
  13. static void OnDay(HWND hDlg);
  14. static void OnAlermJihou(HWND hDlg, WORD id);
  15. static void On12Hour(HWND hDlg);
  16. static void OnDelAlarm(HWND hDlg);
  17. static void OnFileChange(HWND hDlg, WORD id);
  18. static void OnTest(HWND hDlg, WORD id);
  19. void OnSanshoAlarm(HWND hDlg, WORD id);
  20. void GetMMFileExts(char* dst);
  21. BOOL IsMMFile(char* fname);
  22.  
  23. static PALARMSTRUCT pAS = NULL;
  24. static int curAlarm = 0, maxAlarm = 1;
  25. static BOOL bPlaying = FALSE;
  26.  
  27. BOOL CALLBACK HookProcAlarm(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
  28.  
  29. /*------------------------------------------------
  30.  「アラーム」ページ用ダイアログプロシージャ
  31. --------------------------------------------------*/
  32. BOOL CALLBACK PageAlarmProc(HWND hDlg, UINT message,
  33.     WPARAM wParam, LPARAM lParam)
  34. {
  35.     switch(message)
  36.     {
  37.         case WM_INITDIALOG:
  38.             OnInit(hDlg);
  39.             return TRUE;
  40.         case WM_COMMAND:
  41.         {
  42.             WORD id, code;
  43.             id = LOWORD(wParam); code = HIWORD(wParam);
  44.             // アラーム選択コンボボックス
  45.             if(id == IDC_COMBOALARM && code == CBN_SELCHANGE)
  46.             {
  47.                 OnChangeAlarm(hDlg);
  48.                 SendPSChanged(hDlg);
  49.             }
  50.             //「アラームを鳴らす」「時報を鳴らす」
  51.             else if(id == IDC_ALARM || id == IDC_JIHOU)
  52.                 OnAlermJihou(hDlg, id);
  53.             // 時、分テキストボックス
  54.             else if((id == IDC_HOURALARM || id == IDC_MINUTEALARM)
  55.                 && code == EN_CHANGE)
  56.             {
  57.                 OnChangeTime(hDlg);
  58.                 SendPSChanged(hDlg);
  59.             }
  60.             else if(id == IDC_ALARMDAY) // Day...
  61.             {
  62.                 OnDay(hDlg);
  63.             }
  64.             // 「サウンド」テキストボックス
  65.             else if((id == IDC_FILEALARM || id == IDC_FILEJIHOU)
  66.                 && code == EN_CHANGE)
  67.             {
  68.                 OnFileChange(hDlg, id);
  69.                 SendPSChanged(hDlg);
  70.             }
  71.             // 「...」
  72.             else if(id == IDC_SANSHOALARM || id == IDC_SANSHOJIHOU)
  73.             {
  74.                 OnSanshoAlarm(hDlg, id);
  75.                 OnFileChange(hDlg, (WORD)(id - 1));
  76.                 SendPSChanged(hDlg);
  77.             }
  78.             // 「12時間制」
  79.             else if(id == IDC_12HOURALARM)
  80.                 On12Hour(hDlg);
  81.             // 「繰り返す」「点滅する」
  82.             else if(id == IDC_REPEATALARM || id == IDC_REPEATJIHOU ||
  83.                 id == IDC_BLINKALARM || id == IDC_BLINKJIHOU)
  84.                 SendPSChanged(hDlg);
  85.             // 「×」
  86.             else if(id == IDC_DELALARM)
  87.                 OnDelAlarm(hDlg);
  88.             // サウンドのテスト
  89.             else if(id == IDC_TESTALARM || id == IDC_TESTJIHOU)
  90.                 OnTest(hDlg, id);
  91.             return TRUE;
  92.         }
  93.         case WM_NOTIFY:
  94.             switch(((NMHDR *)lParam)->code)
  95.             {
  96.                 case PSN_APPLY: OnApply(hDlg); break;
  97.                 case PSN_HELP: MyHelp(GetParent(hDlg), 3); break;
  98.             }
  99.             return TRUE;
  100.         case WM_DESTROY:
  101.             if(bPlaying) StopFile(); bPlaying = FALSE;
  102.             if(pAS) free(pAS); pAS = NULL;
  103.             break;
  104.         case MM_MCINOTIFY:
  105.         case MM_WOM_DONE:
  106.             StopFile(); bPlaying = FALSE;
  107.             SendDlgItemMessage(hDlg, IDC_TESTALARM, BM_SETIMAGE, IMAGE_ICON,
  108.                 (LPARAM)hIconPlay);
  109.             SendDlgItemMessage(hDlg, IDC_TESTJIHOU, BM_SETIMAGE, IMAGE_ICON,
  110.                 (LPARAM)hIconPlay);
  111.             return TRUE;
  112.     }
  113.     return FALSE;
  114. }
  115.  
  116. /*------------------------------------------------
  117.  ページの初期化
  118. --------------------------------------------------*/
  119. void OnInit(HWND hDlg)
  120. {
  121.     char subkey[20], s[1024];
  122.     int i;
  123.     
  124.     maxAlarm = GetMyRegLong("", "AlarmNum", 1);
  125.     if(maxAlarm < 1) maxAlarm = 1;
  126.     pAS = malloc(sizeof(ALARMSTRUCT) * maxAlarm);
  127.     for(i = 0; i < maxAlarm; i++)
  128.     {
  129.         wsprintf(subkey, "Alarm%d", i + 1);
  130.         
  131.         pAS[i].bAlarm = GetMyRegLong(subkey, "Alarm", FALSE);
  132.         pAS[i].hour = GetMyRegLong(subkey, "Hour", 12);
  133.         pAS[i].minute = GetMyRegLong(subkey, "Minute", 0);
  134.         GetMyRegStr(subkey, "File", pAS[i].fname, 1024, "");
  135.         pAS[i].bHour12 = GetMyRegLong(subkey, "Hour12", TRUE);
  136.         pAS[i].bRepeat = GetMyRegLong(subkey, "Repeat", FALSE);
  137.         pAS[i].bBlink = GetMyRegLong(subkey, "Blink", FALSE);
  138.         pAS[i].days = GetMyRegLong(subkey, "Days", 0x7f);
  139.         
  140.         wsprintf(s, "%02d:%02d", pAS[i].hour, pAS[i].minute);
  141.         CBAddString(hDlg, IDC_COMBOALARM, (LPARAM)s);
  142.     }
  143.     CBAddString(hDlg, IDC_COMBOALARM, (LPARAM)MyString(IDS_ADDALARM));
  144.     CBSetCurSel(hDlg, IDC_COMBOALARM, 0);
  145.     
  146.     CheckDlgButton(hDlg, IDC_JIHOU,
  147.         GetMyRegLong("", "Jihou", FALSE));
  148.  
  149.     GetMyRegStr("", "JihouFile", s, 1024, "");
  150.     SetDlgItemText(hDlg, IDC_FILEJIHOU, s);
  151.     
  152.     CheckDlgButton(hDlg, IDC_REPEATJIHOU,
  153.         GetMyRegLong("", "JihouRepeat", FALSE));
  154.     
  155.     CheckDlgButton(hDlg, IDC_BLINKJIHOU,
  156.         GetMyRegLong("", "JihouBlink", FALSE));
  157.     
  158.     curAlarm = 0;
  159.     OnChangeAlarm(hDlg);
  160.     OnAlermJihou(hDlg, IDC_JIHOU);
  161.     
  162.     SendDlgItemMessage(hDlg, IDC_TESTALARM, BM_SETIMAGE, IMAGE_ICON,
  163.         (LPARAM)hIconPlay);
  164.     OnFileChange(hDlg, IDC_FILEALARM);
  165.     SendDlgItemMessage(hDlg, IDC_TESTJIHOU, BM_SETIMAGE, IMAGE_ICON,
  166.         (LPARAM)hIconPlay);
  167.     OnFileChange(hDlg, IDC_FILEJIHOU);
  168.     
  169.     SendDlgItemMessage(hDlg, IDC_DELALARM, BM_SETIMAGE, IMAGE_ICON,
  170.         (LPARAM)hIconDel);
  171.     
  172.     bPlaying = FALSE;
  173. }
  174.  
  175. /*------------------------------------------------
  176.  更新
  177. --------------------------------------------------*/
  178. void OnApply(HWND hDlg)
  179. {
  180.     char subkey[10], s[1024];
  181.     int i, n;
  182.     
  183.     n = CBGetCurSel(hDlg, IDC_COMBOALARM);
  184.     pAS[n].bAlarm = IsDlgButtonChecked(hDlg, IDC_ALARM);
  185.     pAS[n].hour = 
  186.         SendDlgItemMessage(hDlg, IDC_SPINHOUR, UDM_GETPOS, 0, 0);
  187.     pAS[n].minute =
  188.         SendDlgItemMessage(hDlg, IDC_SPINMINUTE, UDM_GETPOS, 0, 0);
  189.     GetDlgItemText(hDlg, IDC_FILEALARM, pAS[n].fname, MAX_PATH);
  190.     pAS[n].bHour12 = IsDlgButtonChecked(hDlg, IDC_12HOURALARM);
  191.     pAS[n].bRepeat = IsDlgButtonChecked(hDlg, IDC_REPEATALARM);
  192.     pAS[n].bBlink = IsDlgButtonChecked(hDlg, IDC_BLINKALARM);
  193.     
  194.     for(i = 0; i < maxAlarm; i++)
  195.     {
  196.         wsprintf(subkey, "Alarm%d", i + 1);
  197.         SetMyRegLong(subkey, "Alarm", pAS[i].bAlarm);
  198.     
  199.         SetMyRegLong(subkey, "Hour", pAS[i].hour);
  200.         SetMyRegLong(subkey, "Minute", pAS[i].minute);
  201.         
  202.         SetMyRegStr(subkey, "File", pAS[i].fname);
  203.     
  204.         SetMyRegLong(subkey, "Hour12", pAS[i].bHour12);
  205.         SetMyRegLong(subkey, "Repeat", pAS[i].bRepeat);
  206.         SetMyRegLong(subkey, "Blink", pAS[i].bBlink);
  207.         SetMyRegLong(subkey, "Days", pAS[i].days);
  208.     }
  209.     SetMyRegLong("", "AlarmNum", maxAlarm);
  210.  
  211.     SetMyRegLong("", "Jihou",
  212.         IsDlgButtonChecked(hDlg, IDC_JIHOU));
  213.     
  214.     GetDlgItemText(hDlg, IDC_FILEJIHOU, s, 1024);
  215.     SetMyRegStr("", "JihouFile", s);
  216.     
  217.     SetMyRegLong("", "JihouRepeat",
  218.         IsDlgButtonChecked(hDlg, IDC_REPEATJIHOU));
  219.     SetMyRegLong("", "JihouBlink",
  220.         IsDlgButtonChecked(hDlg, IDC_BLINKJIHOU));
  221. }
  222.  
  223. /*------------------------------------------------
  224.  アラーム用データをコントロールに設定
  225. --------------------------------------------------*/
  226. void OnChangeAlarm(HWND hDlg)
  227. {
  228.     int n;
  229.     
  230.     n = CBGetCurSel(hDlg, IDC_COMBOALARM);
  231.     if(n > maxAlarm) return;
  232.     
  233.     if(n == maxAlarm)
  234.     {
  235.         PALARMSTRUCT pASOld;
  236.         pASOld = pAS;
  237.         pAS = malloc(sizeof(ALARMSTRUCT) * (maxAlarm+1));
  238.         memcpy(pAS, pASOld, sizeof(ALARMSTRUCT) * maxAlarm);
  239.         free(pASOld);
  240.         pAS[n].bAlarm = FALSE;
  241.         pAS[n].hour = 12;
  242.         pAS[n].minute = 0;
  243.         pAS[n].fname[0] = 0;
  244.         pAS[n].bHour12 = TRUE;
  245.         pAS[n].bRepeat = FALSE;
  246.         pAS[n].bBlink = FALSE;
  247.         pAS[n].days = 0x7f;
  248.         CBDeleteString(hDlg, IDC_COMBOALARM, n);
  249.         CBAddString(hDlg, IDC_COMBOALARM, (LPARAM)"12:00");
  250.         CBAddString(hDlg, IDC_COMBOALARM, (LPARAM)MyString(IDS_ADDALARM));
  251.         CBSetCurSel(hDlg, IDC_COMBOALARM, n);
  252.         maxAlarm++;
  253.     }
  254.     
  255.     if(n != curAlarm)
  256.     {
  257.         pAS[curAlarm].bAlarm = IsDlgButtonChecked(hDlg, IDC_ALARM);
  258.         pAS[curAlarm].hour = 
  259.             SendDlgItemMessage(hDlg, IDC_SPINHOUR, UDM_GETPOS, 0, 0);
  260.         pAS[curAlarm].minute =
  261.             SendDlgItemMessage(hDlg, IDC_SPINMINUTE, UDM_GETPOS, 0, 0);
  262.         GetDlgItemText(hDlg, IDC_FILEALARM, pAS[curAlarm].fname, MAX_PATH);
  263.         pAS[curAlarm].bHour12 = IsDlgButtonChecked(hDlg, IDC_12HOURALARM);
  264.         pAS[curAlarm].bRepeat = IsDlgButtonChecked(hDlg, IDC_REPEATALARM);
  265.         pAS[curAlarm].bBlink = IsDlgButtonChecked(hDlg, IDC_BLINKALARM);
  266.     }
  267.     
  268.     CheckDlgButton(hDlg, IDC_ALARM, pAS[curAlarm].bAlarm);
  269.     
  270.     SendDlgItemMessage(hDlg, IDC_SPINHOUR, UDM_SETRANGE, 0,
  271.         MAKELONG(23, 0));
  272.     SendDlgItemMessage(hDlg, IDC_SPINHOUR, UDM_SETPOS, 0,
  273.         pAS[n].hour);
  274.     
  275.     SendDlgItemMessage(hDlg, IDC_SPINMINUTE, UDM_SETRANGE, 0,
  276.         MAKELONG(59, 0));
  277.     SendDlgItemMessage(hDlg, IDC_SPINMINUTE, UDM_SETPOS, 0,
  278.         pAS[n].minute);
  279.     
  280.     SetDlgItemText(hDlg, IDC_FILEALARM, pAS[n].fname);
  281.  
  282.     CheckDlgButton(hDlg, IDC_12HOURALARM, pAS[n].bHour12);
  283.     CheckDlgButton(hDlg, IDC_REPEATALARM, pAS[n].bRepeat);
  284.     CheckDlgButton(hDlg, IDC_BLINKALARM, pAS[n].bBlink);
  285.     
  286.     EnableDlgItem(hDlg, IDC_DELALARM, (maxAlarm >= 2));
  287.  
  288.     OnAlermJihou(hDlg, IDC_ALARM);
  289.     On12Hour(hDlg);
  290.  
  291.     curAlarm = n;
  292. }
  293.  
  294. /*------------------------------------------------
  295.  時、分の変更
  296. --------------------------------------------------*/
  297. void OnChangeTime(HWND hDlg)
  298. {
  299.     int n, hour, minute;
  300.     char s[20];
  301.  
  302.     n = CBGetCurSel(hDlg, IDC_COMBOALARM);
  303.     
  304.     hour = SendDlgItemMessage(hDlg, IDC_SPINHOUR, UDM_GETPOS, 0, 0);
  305.     minute = SendDlgItemMessage(hDlg, IDC_SPINMINUTE, UDM_GETPOS, 0, 0);
  306.     
  307.     wsprintf(s, "%02d:%02d", hour, minute);
  308.     CBDeleteString(hDlg, IDC_COMBOALARM, n);
  309.     CBInsertString(hDlg, IDC_COMBOALARM, n, (LPARAM)s);
  310.     CBSetCurSel(hDlg, IDC_COMBOALARM, n);
  311. }
  312.  
  313. /*------------------------------------------------
  314.   "Day..."
  315. --------------------------------------------------*/
  316. void OnDay(HWND hDlg)
  317. {
  318.     int n;
  319.     
  320.     n = SetAlarmDay(hDlg, pAS[curAlarm].days);
  321.     if(n != pAS[curAlarm].days)
  322.     {
  323.         pAS[curAlarm].days = n;
  324.         SendPSChanged(hDlg);
  325.     }
  326. }
  327.  
  328. /*------------------------------------------------
  329.  「アラームを鳴らす」「時報を鳴らす」
  330. --------------------------------------------------*/
  331. void OnAlermJihou(HWND hDlg, WORD id)
  332. {
  333.     int s, e, i;
  334.     BOOL b;
  335.  
  336.     if(id == IDC_ALARM)
  337.     {
  338.         s = IDC_LABTIMEALARM; e = IDC_BLINKALARM;
  339.     }
  340.     else
  341.     {
  342.         s = IDC_LABSOUNDJIHOU; e = IDC_BLINKJIHOU;
  343.     }
  344.  
  345.     b = IsDlgButtonChecked(hDlg, id);
  346.     for(i = s; i <= e; i++)    EnableDlgItem(hDlg, i, b);
  347.  
  348.     if(id == IDC_ALARM)
  349.         OnFileChange(hDlg, IDC_FILEALARM);
  350.     else
  351.         OnFileChange(hDlg, IDC_FILEJIHOU);
  352.     
  353.     SendPSChanged(hDlg);
  354. }
  355.  
  356. /*------------------------------------------------
  357.  「...」 サウンドファイルの参照
  358. --------------------------------------------------*/
  359. void OnSanshoAlarm(HWND hDlg, WORD id)
  360. {
  361.     OPENFILENAME ofn;
  362.     char filter[1024], mmfileexts[1024];
  363.     char fname[MAX_PATH], ftitle[MAX_PATH], initdir[MAX_PATH];
  364.     
  365.     memset(&ofn, '\0', sizeof(OPENFILENAME));
  366.     
  367.     filter[0] = filter[1] = 0;
  368. /*
  369.     str0cat(filter, MyString(IDS_SOUNDFILE));
  370.     str0cat(filter, "*.wav");
  371. */
  372.     str0cat(filter, MyString(IDS_MMFILE));
  373.     GetMMFileExts(mmfileexts);
  374.     str0cat(filter, mmfileexts);
  375.     str0cat(filter, MyString(IDS_ALLFILE));
  376.     str0cat(filter, "*.*");
  377.     
  378.     GetDlgItemText(hDlg, id - 1, initdir, MAX_PATH);
  379.     if(initdir[0] == 0 || /* ext_cmp(initdir, "wav") == 0)
  380.         ofn.nFilterIndex = 1;
  381.     else if(*/ IsMMFile(initdir)) ofn.nFilterIndex = 1;
  382.     else ofn.nFilterIndex = 2;
  383.  
  384.     if(initdir[0])
  385.     {
  386.         WIN32_FIND_DATA fd;
  387.         HANDLE hfind;
  388.         hfind = FindFirstFile(initdir, &fd);
  389.         if(hfind != INVALID_HANDLE_VALUE)
  390.         {
  391.             FindClose(hfind);
  392.             del_title(initdir);
  393.         }
  394.         else strcpy(initdir, mydir);
  395.     }
  396.     else strcpy(initdir, mydir);
  397.     
  398.     fname[0] = 0;
  399.     ofn.lStructSize = sizeof(OPENFILENAME);
  400.     ofn.hwndOwner = hDlg;
  401.     ofn.hInstance = hInst;
  402.     ofn.lpstrFilter = filter;
  403.     ofn.lpstrFile= fname;
  404.     ofn.nMaxFile = MAX_PATH;
  405.     ofn.lpstrFileTitle = ftitle;
  406.     ofn.nMaxFileTitle = MAX_PATH;
  407.     ofn.lpstrInitialDir = initdir;
  408.     ofn.lpfnHook = HookProcAlarm;
  409.     ofn.lpTemplateName = MAKEINTRESOURCE(IDD_TESTSOUND);
  410.     ofn.Flags = OFN_HIDEREADONLY|OFN_EXPLORER|OFN_FILEMUSTEXIST|
  411.         OFN_ENABLEHOOK| OFN_ENABLETEMPLATE;
  412.     
  413.     if(!GetOpenFileName(&ofn)) return;
  414.     
  415.     SetDlgItemText(hDlg, id - 1, ofn.lpstrFile);
  416.     PostMessage(hDlg, WM_NEXTDLGCTL, 1, FALSE);
  417. }
  418.  
  419. /*------------------------------------------------
  420.  「12時間制」
  421. --------------------------------------------------*/
  422. void On12Hour(HWND hDlg)
  423. {
  424.     WORD h, u, l;
  425.     
  426.     h = (WORD)SendDlgItemMessage(hDlg, IDC_SPINHOUR, UDM_GETPOS, 0, 0);
  427.     if(h > 23) h = 23;
  428.     if(h <  0) h = 0;
  429.     
  430.     //スピンボタンコントロールの最大値と最小値の設定
  431.     u = 23; l = 0;
  432.     if(IsDlgButtonChecked(hDlg, IDC_12HOURALARM))
  433.     {
  434.         if(h > 12) h -= 12;
  435.         if(h == 0) h = 12;
  436.         u = 12; l = 1;
  437.     }
  438.     SendDlgItemMessage(hDlg, IDC_SPINHOUR, UDM_SETPOS, 0, h);
  439.     SendDlgItemMessage(hDlg, IDC_SPINHOUR, UDM_SETRANGE, 0,
  440.         MAKELONG(u, l));
  441.     SendPSChanged(hDlg);
  442. }
  443.  
  444. /*------------------------------------------------
  445.  アラーム削除
  446. --------------------------------------------------*/
  447. void OnDelAlarm(HWND hDlg)
  448. {
  449.     int n;
  450.     PALARMSTRUCT pASOld;
  451.     
  452.     if(maxAlarm < 2) return;
  453.     
  454.     n = CBGetCurSel(hDlg, IDC_COMBOALARM);
  455.     
  456.     pASOld = pAS;
  457.     pAS = malloc(sizeof(ALARMSTRUCT) * (maxAlarm-1));
  458.  
  459.     if(n > 0) memcpy(pAS, pASOld, sizeof(ALARMSTRUCT) * n);
  460.     if(n < maxAlarm - 1)
  461.         memcpy((pAS + n), (pASOld + (n+1)),
  462.             sizeof(ALARMSTRUCT) * (maxAlarm - n - 1));
  463.     maxAlarm--;
  464.     free(pASOld);
  465.  
  466.     PostMessage(hDlg, WM_NEXTDLGCTL, 1, FALSE);
  467.     CBDeleteString(hDlg, IDC_COMBOALARM, n);
  468.     if(n > 0) { n--; curAlarm--; }
  469.     CBSetCurSel(hDlg, IDC_COMBOALARM, n);
  470.     OnChangeAlarm(hDlg);
  471. }
  472.  
  473. /*------------------------------------------------
  474.  PLAY/STOPボタンの有効/無効化
  475. --------------------------------------------------*/
  476. void OnFileChange(HWND hDlg, WORD id)
  477. {
  478.     char fname[MAX_PATH];
  479.     BOOL b = FALSE;
  480.  
  481.     GetDlgItemText(hDlg, id, fname, MAX_PATH);
  482.     if(IsWindowEnabled(GetDlgItem(hDlg, id)))
  483.         b = TRUE;
  484.     EnableDlgItem(hDlg, id + 3, b);
  485.     
  486.     EnableDlgItem(hDlg,
  487.         (id==IDC_FILEALARM)?IDC_REPEATALARM:IDC_REPEATJIHOU,
  488.         b?IsMMFile(fname):FALSE);
  489. }
  490.  
  491. /*------------------------------------------------
  492.  サウンドのPLAY/STOP
  493. --------------------------------------------------*/
  494. void OnTest(HWND hDlg, WORD id)
  495. {
  496.     char fname[MAX_PATH];
  497.     
  498.     GetDlgItemText(hDlg, id - 3, fname, MAX_PATH);
  499.     if(fname[0] == 0) return;
  500.  
  501.     if((HICON)SendDlgItemMessage(hDlg, id, BM_GETIMAGE, IMAGE_ICON, 0)
  502.         == hIconPlay)
  503.     {
  504.         if(PlayFile(hDlg, fname, 0))
  505.         {
  506.             SendDlgItemMessage(hDlg, id, BM_SETIMAGE, IMAGE_ICON,
  507.                 (LPARAM)hIconStop);
  508.             InvalidateRect(GetDlgItem(hDlg, id), NULL, FALSE);
  509.             bPlaying = TRUE;
  510.         }
  511.     }
  512.     else
  513.     {
  514.         StopFile();
  515.         bPlaying = FALSE;
  516.     }
  517. }
  518.  
  519. /*------------------------------------------------
  520.  コモンダイアログのフックプロシージャ
  521.  参考:Visual C++ 4.xのサンプルCOMDLG32
  522. --------------------------------------------------*/
  523. BOOL CALLBACK HookProcAlarm(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
  524. {
  525.     switch(message)
  526.     {
  527.         case WM_INITDIALOG:
  528.             SendDlgItemMessage(hDlg, IDC_TESTSOUND, BM_SETIMAGE, IMAGE_ICON,
  529.                 (LPARAM)hIconPlay);
  530.             EnableDlgItem(hDlg, IDC_TESTSOUND, FALSE);
  531.             break;
  532.         case WM_DESTROY:
  533.             if(bPlaying) StopFile(); bPlaying = FALSE;
  534.             break;
  535.         case WM_NOTIFY:
  536.             switch(((LPOFNOTIFY)lParam)->hdr.code)
  537.             {
  538.                 case CDN_SELCHANGE:
  539.                 case CDN_FOLDERCHANGE:
  540.                 {
  541.                     char fname[MAX_PATH];
  542.                     if (CommDlg_OpenSave_GetFilePath(GetParent(hDlg),
  543.                         fname, sizeof(fname)) <= sizeof(fname))
  544.                     {
  545.                         EnableDlgItem(hDlg, IDC_TESTSOUND,
  546.                             fname[0]);
  547.                     }
  548.                 }
  549.                 break;
  550.             }
  551.             return FALSE;
  552.         case WM_COMMAND:
  553.             if(LOWORD(wParam) == IDC_TESTSOUND)
  554.             {
  555.                 char fname[MAX_PATH];
  556.                 if(CommDlg_OpenSave_GetFilePath(GetParent(hDlg),
  557.                     fname, sizeof(fname)) <= sizeof(fname))
  558.                 {
  559.                     if((HICON)SendDlgItemMessage(hDlg, IDC_TESTSOUND, BM_GETIMAGE, IMAGE_ICON, 0)
  560.                         == hIconPlay)
  561.                     {
  562.                         if(PlayFile(hDlg, fname, 0))
  563.                         {
  564.                             SendDlgItemMessage(hDlg, IDC_TESTSOUND, BM_SETIMAGE, IMAGE_ICON,
  565.                                 (LPARAM)hIconStop);
  566.                             InvalidateRect(GetDlgItem(hDlg, IDC_TESTSOUND), NULL, FALSE);
  567.                             bPlaying = TRUE;
  568.                         }
  569.                     }
  570.                     else
  571.                     {
  572.                         StopFile(); bPlaying = FALSE;
  573.                     }
  574.                 }
  575.             }
  576.             return FALSE;
  577.         case MM_MCINOTIFY:
  578.         case MM_WOM_DONE:
  579.             StopFile(); bPlaying = FALSE;
  580.             SendDlgItemMessage(hDlg, IDC_TESTSOUND, BM_SETIMAGE, IMAGE_ICON,
  581.                 (LPARAM)hIconPlay);
  582.             InvalidateRect(GetDlgItem(hDlg, IDC_TESTSOUND), NULL, FALSE);
  583.             return FALSE;
  584.         default:
  585.             return FALSE;
  586.     }
  587.     return TRUE;
  588. }
  589.  
  590. /*------------------------------------------------
  591.  WIN.INIからMCIファイルの拡張子を取得
  592. --------------------------------------------------*/
  593. void GetMMFileExts(char* dst)
  594. {
  595.     char s[1024], *sp, *dp;
  596.     
  597.     GetProfileString("mci extensions", NULL, "",
  598.         s, 1024);
  599.  
  600.     sp = s; dp = dst;
  601.     while(*sp)
  602.     {
  603.         if(dp != dst) *dp++ = ';';
  604.         *dp++ = '*'; *dp++ = '.';
  605.         while(*sp) *dp++ = *sp++;
  606.         sp++;
  607.     }
  608.     *dp = 0;
  609. }
  610.  
  611. /*------------------------------------------------
  612.  MCIファイルかどうか
  613. --------------------------------------------------*/
  614. BOOL IsMMFile(char* fname)
  615. {
  616.     char s[1024], *sp;
  617.     
  618.     if(lstrcmpi(fname, "cdaudio") == 0) return TRUE;
  619.  
  620.     GetProfileString("mci extensions", NULL, "",
  621.         s, 1024);
  622.     
  623.     sp = s;
  624.     while(*sp)
  625.     {
  626.         if(ext_cmp(fname, sp) == 0) return TRUE;
  627.         while(*sp) sp++; sp++;
  628.     }
  629.     return FALSE;
  630. }
  631.