




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
1、前言:音樂播放器其實我在大一的時候就用非常生硬的語法寫出過一個非常簡陋的播放器。這次寫的這個是以前那個的加強版。雖然說還是有很多bug,而且我至今不知道那些BUG是什么地方的問題。 先給個截圖吧,播放器的界面:其實看著還是有那么回事的。恩,其實除了波形和在線下載的話,功能和酷狗,以及千千靜聽等播放器的功能是一樣的。 音樂播放器的關鍵是播放音樂,所以第一步是要設計一個類,這個類擁有各種各樣的播放音樂的能力。 我設計的類名字叫Player class Player public: Player(); virtual Player(); void Play();/播放函數(shù) void Pause();
2、/暫停函數(shù) void Stop();/停止函數(shù) void Jump(DWORD pos);/這個函數(shù)是用來通過直接拖動進度條,然后播放從歌曲的相應位置播放的函數(shù) void Read(CString str);/這個函數(shù)必須在所有函數(shù)的前面調(diào)用,他有一個傳入?yún)?shù),是指MP3文件的路徑 void SetVolume(DWORD vol);/音量大小的設定。這個不難 MCI_STATUS_PARMS GetMode();/這個比較關鍵,是獲得當前的播放狀態(tài)(一首歌是否播放完了就是靠他) MCI_STATUS_PARMS GetNow();/當前是播放的歌曲第幾分第幾秒?可以用來改變時間欄和進度條 M
3、CI_STATUS_PARMS GetLenth();/獲得歌曲的長度。(時間)private: MCI_PLAY_PARMS m_play; MCI_OPEN_PARMS m_open; MCIDEVICEID m_dID; HWND m_parent; MCI_STATUS_PARMS m_status; MCI_SEEK_PARMS m_seek; MCI_STATUS_PARMS m_mode; 各個函數(shù)(可以作為以后MCI函數(shù)的查閱手冊)實現(xiàn)方法是:void Player:Read(CString str) m_dID=NULL; m_open.lpstrElementName=st
4、r; mciSendCommand(NULL,MCI_OPEN,MCI_OPEN_ELEMENT,(DWORD)(LPVOID)&m_open);/MCI打開文件 m_dID=m_open.wDeviceID; void Player:Play() m_play.dwCallback=(DWORD)m_parent; mciSendCommand(m_dID,MCI_PLAY,MCI_NOTIFY,(DWORD)(LPVOID)&m_play);/播放.下面就不寫注釋了void Player:Pause() mciSendCommand(m_dID,MCI_PAUSE,NULL
5、,NULL);void Player:Stop() mciSendCommand(m_dID,MCI_CLOSE,NULL,NULL); m_status.dwReturn=0;MCI_STATUS_PARMS Player:GetLenth() m_status.dwItem=MCI_STATUS_LENGTH; mciSendCommand(m_dID,MCI_STATUS,MCI_STATUS_ITEM,(DWORD)(LPVOID)&m_status); return m_status;MCI_STATUS_PARMS Player:GetNow() m_status.dwIt
6、em=MCI_STATUS_POSITION; mciSendCommand(m_dID,MCI_STATUS,MCI_STATUS_ITEM,(DWORD)(LPVOID)&m_status); return m_status;MCI_STATUS_PARMS Player:GetMode() m_mode.dwItem=MCI_STATUS_MODE; mciSendCommand(m_dID,MCI_STATUS,MCI_STATUS_ITEM,(DWORD)(LPVOID)&m_mode); return m_mode;void Player:Jump(DWORD po
7、s) m_seek.dwTo=pos; mciSendCommand(m_dID,MCI_SEEK,MCI_TO|MCI_WAIT,(DWORD)(LPVOID)&m_seek); mciSendCommand(m_dID,MCI_PLAY,MCI_NOTIFY,(DWORD)(LPVOID)&m_play);void Player:SetVolume(DWORD vol) MCI_DGV_SETAUDIO_PARMS mcivol; mcivol.dwCallback=(DWORD)m_parent; mcivol.dwItem=MCI_DGV_SETAUDIO_VOLUME
8、; mcivol.dwValue=vol; mciSendCommand(m_dID,MCI_SETAUDIO,MCI_DGV_SETAUDIO_VALUE|MCI_DGV_SETAUDIO_ITEM,(DWORD)(LPVOID)&mcivol); 基本上都是運用mciSendCommand這個函數(shù),傳入不同的參數(shù),就可以達到不同的效果。Player類設計完成后,在Dlg這個類當中去產(chǎn)生一個對象:MP3這樣就可以通過調(diào)用MP3的各個成員來播放聲音了。 -以上的大部分技術(shù)在大一的時候就有所了解- 后面的文件操作,都是以前不知道的了首先我是在對話框上畫了個列表控件。當然了,所有的歌曲數(shù)據(jù)
9、都是寫在它上面的,最最重要的就是列表的第四欄,文件地址只要有文件地址,前三項都可以計算出來,但是為了優(yōu)化電腦運算速度,可以事先把這些東西寫在文件里面,這樣顯示的時候就不用算了 注意看:對話框初始化工作 BOOL CMusicDlg:OnInitDialog() CDialog:OnInitDialog(); / Add "About." menu item to system menu. / IDM_ABOUTBOX must be in the system command range. ASSERT(IDM_ABOUTBOX & 0xFFF0) = IDM_AB
10、OUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) CString strAboutMenu; strAboutMenu.LoadString(IDS_ABOUTBOX); if (!strAboutMenu.IsEmpty() pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); / S
11、et the icon for this dialog. The framework does this automatically / when the application's main window is not a dialog SetIcon(m_hIcon, TRUE); / Set big icon SetIcon(m_hIcon, FALSE); / Set small icon / TODO: Add extra initialization here m_list.InsertColumn(0,"序列",LVCFMT_LEFT,40);/這里就
12、要記住列表控件是如何讓頭頂上的字按要求劃分的 m_list.InsertColumn(1,"歌曲名",LVCFMT_LEFT,200); m_list.InsertColumn(2,"時長",LVCFMT_LEFT,50); m_list.InsertColumn(3,"歌曲路徑",LVCFMT_LEFT,172); m_songsum=0; m_vol.SetRangeMax(1000);/滑塊控件最大值設定(這里是音量最大設置) m_vol.SetPos(500);/初始化把音量設置為500,注意這里并沒有控制音量,而只是把滑塊放
13、到中間而已/- m_nid.hWnd=this->m_hWnd;/這下面的都是我以前不知道的,功能是讓程序在后臺運行。 m_nid.uID=IDR_MAINFRAME;/其實我也看不大懂每一句的意思,只能了解個大概,把他們當做工具吧 m_nid.cbSize=(DWORD)sizeof(NOTIFYICONDATA); m_nid.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP; m_nid.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME); m_nid.uCallbackMe
14、ssage=WM_MUSICHIDE; m_mode=3;/默認的播放模式是全部歌曲循環(huán)播放 CFile file("musiclist.txt",CFile:modeRead);/這里是打開文件列表,所以即使播放器關掉了,再次打開,還是有上次加載的歌曲,不用再次 /加載了。 char *ch; CString tempstr="" CString ss; DWORD len; int i,r; len=file.GetLength();/這后面的都是文件操作了,主要是把歌曲的路徑以及其他信息讀到列表空間上面去 ch=new charlen+1; chl
15、en=0; file.Read(ch,len); file.Close(); for(i=0;i<(int)len;i+) if(chi='!') ss.Format("%03d",m_songsum); r=m_list.InsertItem(m_songsum,ss); m_songsum+; m_list.SetItemText(r,1,tempstr); tempstr="" continue; if(chi='') m_list.SetItemText(r,2,tempstr); tempstr="
16、;" continue; if(chi='n') m_list.SetItemText(r,3,tempstr); tempstr="" continue; tempstr+=chi; return TRUE; / return TRUE unless you set the focus to a control 發(fā)一張隱藏后的圖: 其實效果還是和那些播放器很像的。 接下來收錄一個文件夾導入的函數(shù)(太多要記憶的。) void CMusicDlg:OnBtnOpenbrose() / TODO: Add your control notificati
17、on handler code here BROWSEINFO bi; :ZeroMemory(&bi,sizeof(bi); MCI_STATUS_PARMS status; LPITEMIDLIST target=SHBrowseForFolder(&bi); if(target!=NULL) char targetpathMAX_PATH; SHGetPathFromIDList(target,targetpath); CString tm_filepath; CString tm_title; CString tm_time; CString tm_p; CString
18、 ss; tm_filepath.Format("%s*.*",targetpath); CFileFind folder; folder.FindFile(tm_filepath); int flag=folder.FindNextFile(); while(flag) flag=folder.FindNextFile(); tm_title=folder.GetFileName(); tm_filepath=folder.GetFilePath(); tm_p=tm_title.Right(3); if(tm_p="mp3") ss.Format(&
19、quot;%03d",m_songsum); int r=m_list.InsertItem(m_songsum,ss); m_songsum+; m_list.SetItemText(r,0,ss); m_list.SetItemText(r,1,tm_title); m_list.SetItemText(r,3,tm_filepath); mp3.Read(tm_filepath); status=mp3.GetLenth(); int min,sec; CString str; min=(status.dwReturn/1000)/60; sec=(status.dwReturn/1000)%60; CString sstr; sstr.Format("%02d:%02d",min,sec); m_list.SetItemText(r,2,sstr); mp3.Stop(); 然后其他的感覺都不是很難了。定時器這些東西雖然以前不知道,不過后來看了一下也很快
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 別墅建筑工程合同范本
- 加盟入股協(xié)議合同范本
- 租賃攤位合同范本
- 出售大米合同范本
- 醫(yī)美合作合同范本
- 農(nóng)村房租建設合同范例
- 兼職簽定勞動合同范本
- 出售附近廠房合同范本
- 農(nóng)戶房屋流轉(zhuǎn)合同范本
- 個人欠款合同范本模板
- 外陰及陰道炎癥
- 球泡檢驗標準
- 公安筆錄模板之詢問嫌疑人(書面?zhèn)鲉局伟舶讣?
- 振動分析基礎講義1
- 記賬憑證匯總表excel模板
- 鄧麗君經(jīng)典歌曲30首簡譜(共33頁)
- 故障診斷技術(shù)的國內(nèi)外發(fā)展現(xiàn)狀(共3頁)
- 園林綠化施工通用表格模板
- 初中《生物》(人教版)實驗目錄表
- 人民檢察院信訪案件終結(jié)辦法
- 最新三級醫(yī)師查房督導評分細則及檢查登記表資料
評論
0/150
提交評論