在改正俄羅斯方塊程序的功能的時候,想給這個程序增長一個背景音樂。本想用PlayWave來作的,但想到這個功能十分經常使用,那還不如封裝一個本身的CMusicios
類,以備不時之需。原本覺得很容易的,但是在真正操做的時候,卻出現了一個問題,就是沒法準確的知道何時音樂播放完成。問題的難道就在於,怎樣將類的成員函數做爲窗口的回調函數。windows
本來用thunk來解決這個問題的,可是在解決的時候出現了一個問題,調試了好幾天都沒有解決。直到最近才解決。(也就是前一篇文章的由來)ide
cMusic.h函數
1 #ifndef CMUSIC_H 2 #define CMUSIC_H 3 4 #ifdef _UNICODE 5 #define tstring wstring 6 #define tcout wcout 7 #define tcin wcin 8 #else 9 #define tstring string 10 #define tcout cout 11 #define tcin cin 12 13 #endif 14 15 #pragma warning(disable:4311) 16 17 #include "TCHAR.h" 18 #include<iostream> 19 #include<windows.h> 20 #include<string> 21 #include<vector> 22 #include<MMSystem.h> 23 #pragma comment(lib,"Winmm.lib") 24 using namespace std; 25 26 typedef LRESULT (*pfaCallBack)(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam); 27 #pragma pack(push,1) 28 struct Thunk 29 { 30 BYTE op_movecx; 31 DWORD_PTR val_ecx; 32 BYTE op_call; 33 DWORD_PTR val_address; 34 }; 35 #pragma pack(pop) 36 37 #define MY_WM_PLAY WM_USER+1 38 #define MY_WM_PAUSE WM_USER+2 39 #define MY_WM_STOP WM_USER+3 40 #define MY_WM_CLOSE WM_USER+4 41 #define MY_WM_PLAYNEXT WM_USER+5 42 #define MY_WM_PLAYLAST WM_USER+6 43 #define MY_WM_REPLAY WM_USER+7 44 #define MY_WM_PLAY_LOOP WM_USER+8 45 #define MY_WM_RESUME WM_USER+9 46 #define MY_WM_TEST0 WM_USER+10 47 48 //類說明開始 49 //=========================================================// 50 // 功能:播放音樂以及進行相關的控制 51 // 設計思路: 52 // 這個類的實現應該會比較簡單,主要是利用MCI開頭的函數來進行控制 53 // 最主要實現一下功能: 54 // 播放一個音頻文件 55 // 暫停播放 56 // 恢復播放 57 // 獲得音頻文件的信息 58 // 文件名 59 // 長度 60 // 當前播放的位置 61 // 顯示播放列表//一個文件夾中的全部MP3或者是wav文件 62 // 播放上一首 63 // 播放下一首 64 // 65 // 做者:張敏 66 // 日期:2013-1-10 郵箱 zhang19min88@163.com 67 // 注意:實現這個類個人最大的感想就是不要想在一個類中封裝全部的函數 68 // 在真正要用的時候再進行繼承 69 //也許這樣不會焦頭亂額 70 //=========================================================// 71 class ZMCMusic 72 { 73 public: 74 friend DWORD WINAPI ThreadProc(LPVOID); 75 public: 76 ZMCMusic();//構造函數 77 ~ZMCMusic();//析構函數 78 public: 79 void Init(); 80 void AddPlayList(tstring tstrDir); 81 BOOL Play(); 82 BOOL Pause(); 83 BOOL Resume(); 84 BOOL Stop(); 85 BOOL Close(); 86 BOOL Replay(); 87 BOOL PlayNext();//播放下一曲 88 BOOL playLast();//播放上一曲 89 BOOL GetFileInfo(); 90 BOOL LoadMusicFile(tstring const tstrFileNmae); 91 static void ShowError(); 92 private: 93 void GetCurPos(); 94 void GetFileLenth(); 95 int MakeWindow();//產生一個窗口 96 int CreateWindowInThread();//在線程中建立窗口 97 LRESULT ProcWindow(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam);//窗口過程的處理函數 98 private: 99 tstring m_tstrFileName; 100 vector<tstring> m_vcPlayList;//保存播放列表 101 int m_nCurPlayIndex;//當前正在播放文件夾的索引 102