#include #include //for PathFindFileName関数 #include"resource.h" #include"DIB8.h" #include"WAVE.h" #include"HSB.h" //Import Library: Shlwapi.lib & winmm.lib #define APP_NAME "WavePlayer" //オリジナルメッセージ #define WM_DIALOG_CREATE WM_APP+1 //CreateDialog 関数から制御が返った直後にダイアログボックスへ送る #define WM_DIALOG_OK WM_APP+2 //ダイアログボックスで OK ボタンが押されたときに //メインウィンドウへ送る HINSTANCE hInst; HWND hDlgL=NULL,hDlgR=NULL; BOOL CALLBACK MyDlgProc(HWND hDlg,UINT uMsg,WPARAM wParam,LPARAM lParam) { static BYTE leftR,leftG,leftB; //一つのダイアログボックスを static BYTE rightR,rightG,rightB; //二種類あるかのように見せかける(キャプションを変える) int i; //プロシージャも同じものを使う switch(uMsg){ //WM_INITDIALOG メッセージはCreateDialog 関数から制御が返る前に送られる //つまり、CreateDialog 関数の戻り値を保存する hDlgL or hDlgR は NULL のまま case WM_DIALOG_CREATE: //CreateDialog 関数から制御が返った直後に送られる if(hDlg==hDlgL){ SetWindowText(hDlg,"Left Wave"); SetDlgItemInt(hDlg,IDC_EDIT_R,leftR,FALSE); //WM_DIALOG_CREATE SetDlgItemInt(hDlg,IDC_EDIT_G,leftG,FALSE); //WPARAM:0 SetDlgItemInt(hDlg,IDC_EDIT_B,leftB,FALSE); //LPARAM:0 }else{ SetWindowText(hDlg,"Right Wave"); SetDlgItemInt(hDlg,IDC_EDIT_R,rightR,FALSE); SetDlgItemInt(hDlg,IDC_EDIT_G,rightG,FALSE); SetDlgItemInt(hDlg,IDC_EDIT_B,rightB,FALSE); } return TRUE; case WM_COMMAND: //WM_DIALOG_OK switch(LOWORD(wParam)){ //WPARAM:番号(左=0 / 右=1) case IDOK: //LPARAM:COLORREF if(hDlg==hDlgL){ i=GetDlgItemInt(hDlg,IDC_EDIT_R,NULL,TRUE); leftR=(i<0)?0:(i>255)?255:i; i=GetDlgItemInt(hDlg,IDC_EDIT_G,NULL,TRUE); leftG=(i<0)?0:(i>255)?255:i; i=GetDlgItemInt(hDlg,IDC_EDIT_B,NULL,TRUE); leftB=(i<0)?0:(i>255)?255:i; PostMessage(GetParent(hDlg),WM_DIALOG_OK,0,RGB(leftR,leftG,leftB)); }else{ i=GetDlgItemInt(hDlg,IDC_EDIT_R,NULL,TRUE); rightR=(i<0)?0:(i>255)?255:i; i=GetDlgItemInt(hDlg,IDC_EDIT_G,NULL,TRUE); rightG=(i<0)?0:(i>255)?255:i; i=GetDlgItemInt(hDlg,IDC_EDIT_B,NULL,TRUE); rightB=(i<0)?0:(i>255)?255:i; PostMessage(GetParent(hDlg),WM_DIALOG_OK,1,RGB(rightR,rightG,rightB)); } DestroyWindow(hDlg); return TRUE; case IDCANCEL: DestroyWindow(hDlg); return TRUE; } return FALSE; case WM_DESTROY: if(hDlg==hDlgL) hDlgL=NULL; else hDlgR=NULL; return TRUE; } return FALSE; } int pow(int base,int num) //base の num 乗を返す { int sum=1; for(int i=0;i0xFFFF)?0xFFFF:ia; waveOutSetVolume(hWaveOut,MAKELONG(wVolNow,wVolNow)); mute=FALSE; wsprintf(strVol,"%03d/128",(wVolNow+1)/512); InvalidateRect(hWnd,&rcInfo[2],FALSE); break; case 8: //exit if(IDYES==MessageBox(hWnd,"本当に終了しますか?","終了確認",MB_YESNO)){ KillTimer(hWnd,1); DestroyWindow(hWnd); } return 0; } nPos=i; //クリックした領域番号を保存 gb=0; //テキストカラー変更 赤に InvalidateRect(hWnd,&rcButton[i],FALSE); //クリックした領域だけ再描画 return 0; } } return 0; case WM_LBUTTONUP: gb=255; //テキストカラー変更 白に if(1<=nPos && nPos<=7) InvalidateRect(hWnd,&rcButton[nPos],FALSE); nPos=-1; //初期値に戻す return 0; case MM_WOM_DONE: //再生終了(最後まで再生した or waveOutReset 関数で再生中に止めた) pause=FALSE; waveOutReset(hWaveOut); if(loop && play){ //最後まで再生した iTimeCursor=0; InvalidateRect(hWnd,&rcBar,FALSE); waveOutWrite(hWaveOut,&whdr,sizeof(WAVEHDR)); return 0; } if(play){ //最後まで再生した iTimeCursor=600; wsprintf(strTime,"%02d:%02d:%02d/%02d:%02d:%02d", (maxTime/100)/60,(maxTime/100)%60,maxTime%100, //現在の時間 (maxTime/100)/60,(maxTime/100)%60,maxTime%100); //全体の時間 } for(i=0;i0){ if((!hDlgL || !IsDialogMessage(hDlgL,&msg)) && (!hDlgR || !IsDialogMessage(hDlgR,&msg))){ DispatchMessage(&msg); } } return (int)msg.wParam; }