版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、目錄1基本功能描述12設(shè)計思路13軟件設(shè)計33.1 設(shè)計步驟33.2 界面設(shè)計53.3 關(guān)鍵功能的實現(xiàn)93.3.1 “打開”功能的實現(xiàn)93.3.2 “播放”、“暫?!?、“停止”功能的實現(xiàn)103.3.3 “上一首”和“下一首”功能實現(xiàn)103.3.4 播放模式選擇功能的實現(xiàn)113.3.5 音量滑動條功能的實現(xiàn)123.3.6 播放列表功能的實現(xiàn)134結(jié)論與心得體會145參考文獻156思考題167 附錄177.1調(diào)試報告177.1.1 調(diào)試一177.1.2 調(diào)試二177.2 測試結(jié)果187.3 關(guān)鍵源代碼19多媒體視頻播放器1基本功能描述多媒體視頻播放工具是目前計算機必備的一個軟件,如大家熟悉的Med
2、iaplayer、Realplayer、金山影霸等。是一種用來播放視頻和音頻的軟件。用VC+軟件設(shè)計并編寫出一個多媒體視頻播放器。在設(shè)計期間,可以選擇使用的多媒體控件,制作與用戶交互性較好的應(yīng)用程序界面。對于控件有多種,可以自己選擇。系統(tǒng)能選擇打開、播放、暫停、停止音頻文件和視頻文件,并能控制聲音的大小, 可以播放*.mp3、 *.wma、 *.mdi、 *.wav、 *.avi、 *.dat 等格式的多媒體文件。同時還具有自制的播放列表,可以按照列表上的順序進行一曲、下一曲的播放,并且設(shè)定了順序播放、隨機播放、單曲循環(huán)三種播放模式以供選擇。2設(shè)計思路Windows Media Player是
3、一款Windows系統(tǒng)自帶的播放器,支持通過插件增強功能。其控件作為本次課設(shè)的媒體控件可以滿足要求。并且該控件是微軟自帶的免費控件,通常每個電腦都應(yīng)有這個控件,方便設(shè)計出來的軟件在各個電腦運行。在WMP(Windows Media Player的簡稱)控件里,與多媒體播放器實現(xiàn)功能有關(guān)的類有:Cwmpplayer4,Cwmpcontrols,Cwmpmedia,Cwmpplaylist,Cwmpsettings 五大類。其中播放器的一些基本的功能如播放、暫停、快進、快退等主要是調(diào)用CWMPControl和Cwmpplayer4類實現(xiàn)的;播放器中播放列表的實現(xiàn)主要是調(diào)用Cwmpplaylist類
4、;對于音量的調(diào)節(jié)以及靜音是調(diào)用Cwmpsettings和Cwmpplayer4類實現(xiàn)的。除了以上提到的功能的實現(xiàn),還有打開對話框是調(diào)用打開對話框類,篩選文件是調(diào)用 szFileFilter()文件過濾函數(shù),獲取文件名字和路徑是用GetFileName()和GetNextPathName()函數(shù),音量滑動條Slinder是通過對 CSliderCtrl 類實現(xiàn)的。打開程序,初始化從文檔中讀入文件列表點擊“保存列表”List.txt選擇格式 char szFileFilter“刪除歌曲”和“清除列表”點擊“打開”,判斷是否符合格式否是獲取新文件的路徑寫給播放列表并傳給控件中把打開的對話框關(guān)閉計時器
5、,滑塊清零并開始計時和運行點擊“play”響應(yīng)CwnpControl類中play函數(shù)點擊“pause”響應(yīng)CwnpControl類中pause點擊“stop”響應(yīng)CwnpControl類中stop音量調(diào)制獲取滑塊位置參數(shù)返回響應(yīng)CwnpSetting類中SetVolume圖1視頻播放器流程圖3軟件設(shè)計設(shè)計平臺可以是Win32的操作平臺上,使用已安裝的VC6.0+進行設(shè)計和調(diào)試。在設(shè)計前要確保平臺中有WMP控件。結(jié)合之前的設(shè)計思路,使用 Windows Media Player 等控件來制作多媒體視頻播放器。若是Win64這與VC6.0+不兼容,可以選擇更高的版本。3.1 設(shè)計步驟打開 VC+6
6、.0,點擊“新建”,在“新建”窗口選擇“工程”選項卡。由于程序是基于對話框的 MFC 應(yīng)用程序使用 Windows Media Player等控件來制作多媒體視頻播放器。設(shè)置好地址位置和工程名后點“確定”。這里的工程名字可以是自己的名字拼音縮寫,也可以沒有任何含義。圖2“新建”對話框示意圖由于市場上大多數(shù)多媒體播放器不能通過鼠標拖拽來改變客戶端的大小,這樣為了用戶使用方便。所以應(yīng)選擇基于對話框的MFC應(yīng)用程序的模版。接著點擊“下一步”,由于其他的設(shè)置因與初始設(shè)置一樣,所以保持所有選項不改變,再次點擊“下一步”直到“完成”。圖3“MFC 應(yīng)用程序向?qū)А笔疽鈭D然后是插入控件,先把系統(tǒng)初始化的按鈕用
7、“Delete”刪除,在單擊鼠標右鍵選擇“插入 ActiveX 控件”,在跳出的對話框中選擇“Windows Media Player”(一般當電腦安裝了Windows Media Player,其控件也應(yīng)該存在) ,點擊“確定”。圖4添加“Windows Media Player”控件示意圖雖然已經(jīng)插入控件了,但這時的控件還不能使用,因為控件的各種類并沒有一起加入工程類中。右擊鼠標,選擇“建立類向?qū)А保@時系統(tǒng)跳出對話框提示是否加入來自控件的類,直接點擊“確定”就可以了。圖5“Windows Media Player”控件類添加示意圖接著對控件關(guān)聯(lián)變量,右擊加入的WMP控件,點擊“屬性”,把
8、ID改為“IDC_player”,然后打開“建立類向?qū)А秉c到“Member Variables”頁面向IDC_player添加變量。單擊“ADD Variables”,會彈出圖6所示的“Add member name”對話框,命名為“m_player”,設(shè)為控制“Control”型,點擊“OK” 。圖6變量命名示意圖3.2 界面設(shè)計對于一般多媒體播放器的要求,系統(tǒng)能選擇打開、播放、暫停、停止音頻文件和視頻文件,并能控制聲音的大小,并根據(jù)自己的設(shè)計思路添加表中的按鈕和相應(yīng)的函數(shù),其中函數(shù)的響應(yīng)大多是對鼠標左鍵單擊的響應(yīng)。并且有序簡潔的安排按鈕的位置以及分類,使用戶方便地使用軟件。表1控件 ID
9、以及對應(yīng)響應(yīng)函數(shù)表按鈕 ID 控件 Caption消息響應(yīng)函數(shù)類型IDC_OPEN打開OnOpen()命令按鈕IDC_PLAY播放OnPlay()命令按鈕IDC_PAUSE暫停OnPause()命令按鈕IDC_STOP停止OnStop()命令按鈕IDC_FASTFORWAR快進OnFastforward()命令按鈕IDC_FASTREVERSE快退OnFastreverse()命令按鈕IDC_BUTTONPRE上一曲OnButtonpre()命令按鈕IDC_BUTTONNEXT下一曲OnButtonnext()命令按鈕IDC_MUTE靜音OnMute()命令按鈕IDCANCEL退出無命令按鈕I
10、DC_list隱藏/展開Onlist()命令按鈕IDC_save保存列表Onsave()命令按鈕IDC_ClearOne刪除歌曲OnClearOne() 命令按鈕IDC_ClearAll清空列表OnClearAll()命令按鈕OnRadio1順序播放無單選框OnRadio2隨機播放無單選框OnRadio3循環(huán)播放無單選框然后是加入一些關(guān)聯(lián)變量的控件,之前加入了WMPlayer,還要加入類別為“滑塊”的Slinder來當調(diào)節(jié)聲音的滑塊,還有加入類別為“列表框”的List Control來充當播放列表。表2控件 ID 以及關(guān)聯(lián)變量表按鈕ID控件 Caption變量名稱類型IDC_playerWMP
11、layerm_playerCWMPlayer4IDC_SlinderSlinderm_SlinderCSliderCtrlIDC_LIST1List Controlm_ListCtrlCListBox在按鈕對應(yīng)的消息響應(yīng)函數(shù)中寫程序?qū)⒁玫奖?的變量和WMP控件中的5個類的函數(shù)。在這五個類中:Cwmpplayer4 類主要是關(guān)于對其他類的對象的調(diào)用以及基本的控件功能的實現(xiàn),是WMP控件函數(shù)與外部交流的橋梁,不可缺少。寧外其部分成員函數(shù)還能夠進一步獲取得到其他相關(guān)類對象的實例; Cwmpcontrols 類主要是對控件的更多的操作,例如播放、暫停;Cwmpmedia 類主要是對于媒體文件資源的一
12、些操作,例如獲取路徑和名稱;Cwmpplaylist類主要是關(guān)于播放列表的操作;Cwmpsettings 類主要是對于媒體文件中的一些基本設(shè)置的操作。對WMP控件中的五個類中函數(shù)的使用不能直接使用,而是通過生成的對象來進行調(diào)用,所以對象應(yīng)在“shifanDlg.h”定義,同時類對應(yīng)的頭文件也要在“shifanDlg.h”中用include包含,否則找不到類。若要對對象和變量初始化則應(yīng)該在“shifanDlg.cpp”中的“CShifanDlg:OnInitDialog()”函數(shù)。表3其他類及對應(yīng)對象表類名頭文件名對象名 CWMPControlsWmpcontrols.hm_ControlCWM
13、PSettingswmpsettings.hm_SettingCWMPMediawmpmedia.hm_MediaCWMPPlaylistwmpplaylist.hm_Playlist另外還有一些變量雖然沒有實際多用,但判斷函數(shù)是否靜音,列表是否展開等需使用。定義也在“shifanDlg.h”中。表4其他數(shù)據(jù)定義 數(shù)據(jù)類型變量名數(shù)據(jù)類型變量名CStringm_FileNameintflagCStringm_PathNameintvol除了對各個控件關(guān)聯(lián)變量以及消息響應(yīng)函數(shù),還要對對話框類進行消息響應(yīng)函數(shù)的關(guān)聯(lián),如當一首歌播放完后的模式選擇。應(yīng)用到 WM_TIMER 消息響應(yīng)函數(shù)以及SetTim
14、er()和KillTimer()函數(shù),如圖建立OnTimer函數(shù)。圖7添加“WMTIMER”消息函數(shù)示意圖還有菜單的設(shè)計,其相對簡單,只要名稱和ID與表1保持一致就可以了。在“Resource File”中右擊鼠標添加“MENU”,屬性為“IDR_MENU1”。但是菜單并未與對話窗口有實質(zhì)聯(lián)系,需要將菜單加入到“IDD_SHIFAN_DIALOG”中來,在 “IDD_SHIFAN_DIALOG”窗口空白右鍵單擊,選中菜單“IDR_MENU1”,這樣便完成了對菜單的加載。圖8控件按鈕分布圖編譯運行程序后得到了初步的界面效果圖,當然還沒有加入函數(shù)。同時在左上角會顯示自己寫的工程名“shifan”,
15、如圖8所示。3.3 關(guān)鍵功能的實現(xiàn)對于各個按鈕、列表功能的實現(xiàn)主要是通過對各個函數(shù)加入相應(yīng)的代碼,下文將列出相應(yīng)的關(guān)鍵代碼。3.3.1 “打開”功能的實現(xiàn)“打開”按鈕主要是實現(xiàn)了對打開的文件進行過濾,主要使用了szFileFilter()函數(shù)。點擊確定時,首先是把文件路徑傳給播放列表中,列表在從文件路徑中提取文件名來顯示。然后又把文件路徑通過SetUrl()交給控件讀取播放。void CShifanDlg:OnOpen() char szFileFilter="媒體文件(*.avi,*.mp3,*.wma)|*.avi;*.mp3;*.wma|"/過濾文件 CFileDia
16、log dlg (true,NULL,NULL,OFN_HIDEREADONLY| OFN_ALLOWMULTISELECT|OFN_NOCHANGEDIR,szFileFilter); POSITION pos=dlg.GetStartPosition(); if(dlg.DoModal()=IDOK)/點擊確定添加文件 while(pos!=NULL) m_PathName=dlg.GetNextPathName(pos);/獲取文件路徑 m_FileName=dlg.GetFileName();/獲取文件名 geminghelujing/* m_ListCtrl*/.AddString(
17、m_PathName);/向列表添加文件路徑 m_ListCtrl.AddString(m_PathName); m_player.SetUrl(m_PathName); /讀取路徑開始播放 SetTimer(1,1000,NULL);/播放開始的時候就創(chuàng)建計時器 3.3.2 “播放”、“暫停”、“停止”功能的實現(xiàn)其實3.3.1中提到一種播放方法使用了SetUrl()函數(shù)來實現(xiàn)。這里使用了另外一種方法。void CShifanDlg:OnPlay() CWMPControls m1; m1=m_player.GetControls(); m1.play(); “暫停”和“停止”功能實現(xiàn)方法和播
18、放差不多,只是使用的m1中函數(shù)改變了。void CShifanDlg:OnPause() CWMPControls m1; m1=m_player.GetControls(); m1.pause(); void CShifanDlg:OnStop() CWMPControls m1; m1=m_player.GetControls(); m1.stop(); 3.3.3 “上一首”和“下一首”功能實現(xiàn)“上一首”就是讓光標往上移一行,也就是對應(yīng)的光標變量(index)減去1。當要判斷光標在第一行的情況,也就是index=0的時候,這時光標應(yīng)移到最后一首歌曲或視頻上。void CShifanDlg
19、:OnButtonpre() CString str; int index=m_ListCtrl.GetCurSel()-1;/光標減一 if(index<0) index=m_ListCtrl.GetCount()-1;/如果播放完第一曲就自動播放最后一首 m_ListCtrl.GetText(index,str);/獲得當前光標所指的路徑字符串 m_player.SetUrl(str);/開始播放上一首 m_ListCtrl.SetCurSel(index);/自動置光標 其“下一首”和“上一首”大同小異,只不過index應(yīng)加1,在光標為最后一行時應(yīng)判斷移動到第一行。3.3.4 播放
20、模式選擇功能的實現(xiàn)這里有三種播放模式:“順序播放”、“隨機播放”、“單曲循環(huán)”。這三種模式的實現(xiàn)是在OnTimer()一個時間消息響應(yīng)函數(shù)的實現(xiàn)的。先判斷一個文件播放完畢后,再分別判斷OnRadio1、OnRadio2和OnRadio3對應(yīng)的按鈕是否按下,若有按鈕按下就進入到對應(yīng)的if語句中。順序播放就是int index=m_ListCtrl.GetCurSel()+1跟上一首相同;隨機播放先是用srand(time(0)來每次都能產(chǎn)生不同的隨機數(shù)序列,再用rand()%m_ListCtrl.GetCount()產(chǎn)生隨機光標;循環(huán)播放是m_ListCtrl.GetText(m_ListCtr
21、l.GetCurSel(),m_PathName)實現(xiàn)的。void CShifanDlg:OnTimer(UINT nIDEvent) int index=m_player.GetPlayState();/播放狀態(tài) if(index=1)/如果播放完成 if(CButton *)GetDlgItem(OnRadio1)->GetCheck()/如果是順序播放 CString str; int index=m_ListCtrl.GetCurSel()+1; if(index>=m_ListCtrl.GetCount() index=0; m_ListCtrl.GetText(inde
22、x,str); m_player.SetUrl(str); m_ListCtrl.SetCurSel(index);/自動置光標 /這樣就實現(xiàn)了順序播放 if(CButton *)GetDlgItem(OnRadio2)->GetCheck()/隨機播放 srand(time(0);/目的在于每次都能產(chǎn)生不同的隨機數(shù)序列 m_ListCtrl.SetCurSel(rand()%m_ListCtrl.GetCount();/隨機置光標 m_ListCtrl.GetText(m_ListCtrl.GetCurSel(),m_PathName); m_player.SetUrl(m_PathN
23、ame); if(CButton *)GetDlgItem(OnRadio3)->GetCheck()/單曲循環(huán) m_ListCtrl.GetText(m_ListCtrl.GetCurSel(),m_PathName); m_player.SetUrl(m_PathName); CDialog:OnTimer(nIDEvent);3.3.5 音量滑動條功能的實現(xiàn)音量滑動條是區(qū)別于其他命令按鈕的,它是滑塊,所以相應(yīng)的是Customdraw類型,是調(diào)用 CSliderCtrl 控件的 m_slinder 變量來實現(xiàn)的。音量調(diào)節(jié)函數(shù)主要是使用一個嵌套函數(shù)“m_WMPlayer.GetSett
24、ings().SetVolume(m_slinder.GetPos();”實現(xiàn)的。設(shè)置音量用的是“SetVolume()”函數(shù)。在“OnInitDialog()”函數(shù)中已對滑塊范圍進行初始化m_slinder.SetRange(0,100)。使音量變化范圍為0100。void CShifanDlg:OnCustomdrawSlinder(NMHDR* pNMHDR, LRESULT* pResult) UpdateData(true); m_player.GetSettings().SetVolume(m_Slinder.GetPos(); UpdateData(false); *pResul
25、t = 0;另外靜音程序如下,在靜音之前先判斷該系統(tǒng)音量是否為0,若為0則系統(tǒng)則會恢復(fù)音量;若不為0,則把系統(tǒng)音量保存在vol(在shifanDLG.h中已定義了)中,等恢復(fù)時使用。void CShifanDlg:OnMute() n=!n; if(!n)vol=m_player.GetSettings().GetVolume();/ 獲取當前音量值 m_player.GetSettings().SetVolume(0);/設(shè)為靜音 else m_player.GetSettings().SetVolume(vol);/恢復(fù)當前音量值 3.3.6 播放列表功能的實現(xiàn)播放列表主要有“隱藏/展開”
26、、“保存列表”、“刪除列表”、“清空列表” 這四個功能。這個列表的四個功能實現(xiàn)前提是在工程的文件夾里新建一個txt文檔并命名為“l(fā)ist.txt”。文檔可以保存播放文件列表使在下次打開時可自動的生成播放列表。下面是“保存列表”的函數(shù)。void CShifanDlg:Onsave() CStdioFile file;/定義文本 file.Open(".list.txt",CFile:modeCreate|CFile:modeReadWrite|CFile:typeText);/創(chuàng)建文本 for(int i=0;i<m_ListCtrl.GetCount();i+) CS
27、tring strtemp; m_ListCtrl.GetText(i,strtemp);/獲得文本中的內(nèi)容 strtemp+="n"/需要換行 file.WriteString(strtemp);/將獲得內(nèi)容寫入列表 file.Close(); 然后是“隱藏/展開”功能,其實就是在重新設(shè)置窗口大小,若展開則恢復(fù)原來的窗口大小,這里使用了SetWindowPos()函數(shù)。void CShifanDlg:Onlist() / TODO: Add your control notification handler code here flag=!flag; if(!flag)
28、SetWindowPos(NULL,0,0,560,480,SWP_NOMOVE); else SetWindowPos(NULL,0,0,730,480,SWP_NOMOVE); 最后是“刪除歌曲”和“清除列表”,使用了“DeleteString()”來刪除播放列表中的代表文件路徑的字符串。用“ResetContent()”直接清除列表。同時不管那種功能,執(zhí)行完成后要保存列表,這樣才能使播放列表與list.txt同步。4結(jié)論與心得體會經(jīng)過這次課程設(shè)計,我對MFC又有了更深的了解,同時在不斷編寫中也鞏固了課堂上學(xué)的MFC的各種知識。對于這次課程設(shè)計的選題,我還是根據(jù)自己的興趣愛好選得。所以在做
29、課設(shè)時,自己查找資料和嘗試自己的編寫方法都比較主動。我平時很喜歡聽歌,但聽著聽著收藏的歌曲越來越多,我用過一些很火的聽歌軟件,但都覺得其管理歌曲的方式不完善。所以當我學(xué)習(xí)面向?qū)ο缶幊虝r,我就想以后自己做一個聽歌軟件,正好在我們面向?qū)ο笳n程設(shè)計中有一個多媒體播放器,可以為我自己聽歌軟件打好基礎(chǔ)。在一開始選這個課題時,我和其他同學(xué)都覺得很難。不像簡單計算器和畫圖軟件等課題曾在上課提到過,對于多媒體播放器我看到看到了題目不知道該怎樣做。寫構(gòu)思時無處下筆,也沒有一點頭緒。后來在老師的講解中知道要用多媒體的控件來間接控制播放多媒體文件,還提到只要知道控件的類的使用,這個課題還是很簡單的。然后我和同組的同
30、學(xué)在網(wǎng)上找相應(yīng)的資料,找到怎樣在VC+6.0里加入控件,各個控件的說明書。進過比較和分析,我們一致采用Windows Media Player多媒體軟件旗下的控件WMP控件。因為WMP控件本身就是微軟自帶的控件,不存在兼容問題。還有每個電腦多都有Windows Media Player播放器,其控件也都注冊了。知道怎樣使用WMP控件,就可以很輕松地完成軟件流程圖的設(shè)計。我和同學(xué)一起討論了半天,終于大致理清了流程然后各自畫自己獨特的流程圖了。軟件編寫有時也會遇到許多問題,好多有自己的思路但不知道怎樣實現(xiàn),用什么函數(shù)可以達到這種效果。所以編寫的時候也是不端的查找資料,不斷的討論和嘗試。我從中學(xué)到了
31、很多有用的知識。最后終于變好了,編寫的軟件可以滿足課程設(shè)計給出的要求。系統(tǒng)能選擇打開、播放、暫停、停止音頻文件和視頻文件,并能控制聲音的大小, 可以播放*.mp3、 *.wma、 *.mdi、 *.wav、 *avi、 *dat 等格式的多媒體文件。并且我又在課設(shè)的要求上給多媒體播放器添加了快進快退的功能,以及刪除播放列表選中歌曲的功能。一是為了迎合市場上各類媒體播放軟件的趨勢,二也是使自己用的方便,同時挑戰(zhàn)自己的能力。不過經(jīng)過以上功能的實現(xiàn),其他功能也是熟能生巧,比較簡單??偟目磥?,通過這次課程設(shè)計,我的能力得到了明顯的提高,無論是動手能力還是團隊合作能力,但我認為更重要的是對軟件的編程有了
32、大體的了解,這樣就可以在以后工作中有所必備的綜合素質(zhì)。以前總感覺設(shè)計東西是一件多么復(fù)雜困難的事情,自己根本不能勝任。但這一次的課程設(shè)計我卻親身經(jīng)歷和設(shè)計多媒體播放器。5參考文獻1揣錦華.面向?qū)ο蟪绦蛟O(shè)計與 VC+實踐M.西安電子科技大學(xué)出版社.20052鄭阿奇.Visual C+教程M.北京:機械工業(yè)出版社.20044周長發(fā).Visual C+.NET 多媒體編程M.電子工業(yè)出版社.20025Steve Mack.流媒體寶典.電子工業(yè)出版社.20036王育堅.Visual C+面向?qū)ο缶幊探坛?第 2 版.北京:清華大學(xué)出版社,20086思考題1) 控件自帶的類和本程序中的類是如何共同作用的?
33、答:控件自帶的的類對被對話框程序調(diào)用,當然不能直接調(diào)用,應(yīng)該在對話框中頭文件中(例如shifanDLG.h)通過控件類生成對應(yīng)的對象,這樣在調(diào)用時,直接調(diào)用對象中的函數(shù)就行了。調(diào)用了控件類中的函數(shù)后,還需要調(diào)用對話框自身的函數(shù),比如消息及消息響應(yīng)函數(shù)等函數(shù),以及各控件對應(yīng)的消息響應(yīng)函數(shù)。如此便可以實現(xiàn)控件自帶類和本程序中的類的共同作用。2) 說明程序中調(diào)用的控件函數(shù)的作用?答:控件的不同類有不同的函數(shù)與之對應(yīng),不同函數(shù)有不同的功能。其函數(shù)功能見表。表5控件函數(shù)和對應(yīng)的功能功能控件函數(shù)功能控件函數(shù)打開OnOpen()播放模式OnTimer()播放OnPlay()停止 OnButtonStop()
34、暫停OnButtonPause()上一首 OnButtonPre()快進OnFastforwa下一首OnButtonNext()快退OnFastreverse()保存列表Onsave()聲音滑塊OnCustomdrawSlider() 清空列表Ondelist()7 附錄7.1調(diào)試報告7.1.1 調(diào)試一在調(diào)試播放列表時,看到播放列表中顯示了路徑感覺沒有必要,所以修改了代碼使只把歌曲名給了代碼。但這樣再來播放列表上的歌曲時不能播放。圖9調(diào)試一的說明圖原因:是因為播放列表上只有歌曲名,沒了路徑的話是不能找到文件的,所以不能播放。所以解決方法是修改代碼使其把歌曲路徑遞給播放列表。但后來聽老師的解說,
35、可以通過取字符串函數(shù)來從路徑里取文件名。即播放列表中儲存的是路徑,但顯示的是路徑中文件名。7.1.2 調(diào)試二在實現(xiàn)“刪除歌曲”和“清除歌曲”時,發(fā)現(xiàn)一個問題:雖然這兩個命令按鈕的確有該功能。但在重新打開軟件時,并沒有反應(yīng)到新的播放列表中。原因:在函數(shù)OnClearOne()和OnClearAll()最后沒有Onsave()函數(shù),所以在執(zhí)行該功能時,其功能并沒有反應(yīng)到txt文檔中。修改的程序如下:void CShifanDlg:OnClearOne() / TODO: Add your control notification handler code herem_ListCtrl.Delete
36、String(m_ListCtrl.GetCurSel();/刪除當前光標所選擇的行Onsave();/自動保存刪除某一行后的播放列表 這是修改的地方7.2 測試結(jié)果編寫好的軟件能選擇打開、播放、暫停、停止音頻文件和視頻文件,并能控制聲音的大小, 可以播放*.mp3、 *.wma、 *.mdi、 *.wav、 *avi、 *dat 等格式的多媒體文件。同時還具有自制的播放列表,可以按照列表上的順序進行一曲、下一曲的播放,同時還有保存列表和刪除歌曲的作用,并且設(shè)定了順序播放、隨機播放、單曲循環(huán)三種播放模式以供選擇。圖10播放器播放音樂展示圖11播放器隱藏列表展示7.3 關(guān)鍵源代碼/播放模式選擇v
37、oid CShifanDlg:OnTimer(UINT nIDEvent) int index=m_player.GetPlayState();/播放狀態(tài) if(index=1)/如果播放完成 if(CButton *)GetDlgItem(OnRadio1)->GetCheck()/如果是順序播放 CString str; int index=m_ListCtrl.GetCurSel()+1; if(index>=m_ListCtrl.GetCount() index=0; m_ListCtrl.GetText(index,str); m_player.SetUrl(str);
38、m_ListCtrl.SetCurSel(index);/自動置光標 /這樣就實現(xiàn)了順序播放 if(CButton *)GetDlgItem(OnRadio2)->GetCheck()/隨機播放 srand(time(0);/目的在于每次都能產(chǎn)生不同的隨機數(shù)序列 m_ListCtrl.SetCurSel(rand()%m_ListCtrl.GetCount();/隨機置光標 m_ListCtrl.GetText(m_ListCtrl.GetCurSel(),m_PathName); m_player.SetUrl(m_PathName); if(CButton *)GetDlgItem(
39、OnRadio3)->GetCheck()/單曲循環(huán) m_ListCtrl.GetText(m_ListCtrl.GetCurSel(),m_PathName); m_player.SetUrl(m_PathName); CDialog:OnTimer(nIDEvent);/下一首void CShifanDlg:OnButtonnext() CString str; int index=m_ListCtrl.GetCurSel()+1; /光標加一 if(index>=m_ListCtrl.GetCount() index=0;/如果播放完最后一曲就自動播放第一首 m_ListCt
40、rl.GetText(index,str); /獲得當前光標所指的路徑字符串 m_player.SetUrl(str); /開始播放下一首 m_ListCtrl.SetCurSel(index);/自動置光標 /上一首void CShifanDlg:OnButtonpre() CString str; int index=m_ListCtrl.GetCurSel()-1;/光標減一 if(index<0) index=m_ListCtrl.GetCount()-1;/如果播放完第一曲就自動播放最后一首 m_ListCtrl.GetText(index,str);/獲得當前光標所指的路徑字
41、符串 m_player.SetUrl(str);/開始播放上一首 m_ListCtrl.SetCurSel(index);/自動置光標 /打開void CShifanDlg:OnOpen() char szFileFilter="媒體文件(*.avi,*.mp3,*.wma)|*.avi;*.mp3;*.wma|"/過濾文件 CFileDialog dlg (true,NULL,NULL,OFN_HIDEREADONLY| OFN_ALLOWMULTISELECT|OFN_NOCHANGEDIR,szFileFilter); POSITION pos=dlg.GetStar
42、tPosition(); if(dlg.DoModal()=IDOK)/點擊確定添加文件 while(pos!=NULL) m_PathName=dlg.GetNextPathName(pos);/獲取文件路徑 m_FileName=dlg.GetFileName();/獲取文件名 m_ListCtrl.AddString(m_PathName); m_player.SetUrl(m_PathName); /讀取路徑開始播放 SetTimer(1,1000,NULL);/播放開始的時候就創(chuàng)建計時器 /暫停void CShifanDlg:OnPause() CWMPControls m1; m1
43、=m_player.GetControls(); m1.pause(); /播放void CShifanDlg:OnPlay() CWMPControls m1; m1=m_player.GetControls(); m1.play(); /停止void CShifanDlg:OnStop() CWMPControls m1; m1=m_player.GetControls(); m1.stop(); /調(diào)節(jié)聲音void CShifanDlg:OnCustomdrawSlinder(NMHDR* pNMHDR, LRESULT* pResult) UpdateData(true); m_pla
44、yer.GetSettings().SetVolume(m_Slinder.GetPos(); UpdateData(false); *pResult = 0;/隱藏/展開列表void CShifanDlg:Onlist() flag=!flag; if(!flag) SetWindowPos(NULL,0,0,560,480,SWP_NOMOVE); else SetWindowPos(NULL,0,0,730,480,SWP_NOMOVE); /保存列表void CShifanDlg:Onsave() CStdioFile file;/定義文本 file.Open(".list.
45、txt",CFile:modeCreate|CFile:modeReadWrite|CFile:typeText);/創(chuàng)建文本 for(int i=0;i<m_ListCtrl.GetCount();i+) CString strtemp; m_ListCtrl.GetText(i,strtemp);/獲得文本中的內(nèi)容 strtemp+="n"/需要換行 file.WriteString(strtemp);/將獲得內(nèi)容寫入列表 file.Close(); /靜音void CShifanDlg:OnMute() n=!n; if(!n)vol=m_player
46、.GetSettings().GetVolume();/ 獲取當前音量值 m_player.GetSettings().SetVolume(0);/設(shè)為靜音 else m_player.GetSettings().SetVolume(vol);/恢復(fù)當前音量值 /打開關(guān)于對話框void CShifanDlg:OnAbout() CAboutDlg mydlg; if (IDOK=mydlg.DoModal() /刪除歌曲void CShifanDlg:OnClearOne() / TODO: Add your control notification handler code herem_Li
47、stCtrl.DeleteString(m_ListCtrl.GetCurSel();/刪除當前光標所選擇的行Onsave();/自動保存刪除某一行后的播放列表/清除列表void CShifanDlg:OnClearAll() CStdioFile file;m_ListCtrl.ResetContent();/刪除列表file.Open(".list.txt",CFile:modeCreate);/快進void CShifanDlg:OnFastforward() CWMPControls m1; m1=m_player.GetControls(); m1.fastFor
48、ward();/快退void CShifanDlg:OnFastreverse() CWMPControls m1; m1=m_player.GetControls(); m1.fastReverse();/使雙擊光標播放void CShifanDlg:OnDblclkList1()/雙擊播放 CString str;int index=m_ListCtrl.GetCurSel();/獲取所選行數(shù)m_ListCtrl.GetText(index,str);m_player.SetUrl(str);下午13:0017:00度。全體員工都必須自覺遵守工作時間,實行不定時工作制的員工不必打卡。打卡次數(shù):一日兩次,即早上上班打卡一次,下午下班打卡一次。打卡時間:打卡時間為上班到崗時間和下班離崗時間;
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年常州信息職業(yè)技術(shù)學(xué)院高職單招職業(yè)適應(yīng)性測試備考題庫及答案詳細解析
- 2026年蘭州科技職業(yè)學(xué)院單招綜合素質(zhì)考試備考題庫含詳細答案解析
- 2026年保山中醫(yī)藥高等專科學(xué)校單招綜合素質(zhì)考試備考試題含詳細答案解析
- 2026年成都藝術(shù)職業(yè)大學(xué)高職單招職業(yè)適應(yīng)性測試備考試題及答案詳細解析
- 2026年廣西交通職業(yè)技術(shù)學(xué)院單招職業(yè)技能考試備考試題含詳細答案解析
- 2026年安徽審計職業(yè)學(xué)院單招綜合素質(zhì)筆試參考題庫含詳細答案解析
- 2026四川九洲教育投資管理有限公司招聘語文教師等崗位3人考試重點題庫及答案解析
- 2026年重慶建筑科技職業(yè)學(xué)院單招綜合素質(zhì)筆試備考題庫含詳細答案解析
- 2026年蘇州信息職業(yè)技術(shù)學(xué)院高職單招職業(yè)適應(yīng)性測試備考題庫及答案詳細解析
- 2026年廣西城市職業(yè)大學(xué)高職單招職業(yè)適應(yīng)性測試備考試題及答案詳細解析
- 2025腫瘤靶向藥物皮膚不良反應(yīng)管理專家共識解讀課件
- 腳手架施工安全技術(shù)交底標準模板
- 海姆立克急救課件 (完整版)
- 淘寶主體變更合同范本
- 2025中好建造(安徽)科技有限公司第二次社會招聘13人筆試歷年參考題庫附帶答案詳解
- 《交易心理分析》中文
- 護理創(chuàng)新實踐與新技術(shù)應(yīng)用
- 2025年海南事業(yè)單位聯(lián)考筆試筆試考題(真題考點)及答案
- 2025中國電信股份有限公司重慶分公司社會成熟人才招聘筆試考試參考題庫及答案解析
- 隧道掘進TBM穿越不良地質(zhì)方案
- 新媒體崗位合同范本
評論
0/150
提交評論