vc多媒體播放器_第1頁(yè)
vc多媒體播放器_第2頁(yè)
vc多媒體播放器_第3頁(yè)
vc多媒體播放器_第4頁(yè)
vc多媒體播放器_第5頁(yè)
已閱讀5頁(yè),還剩31頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、目錄1.基本功能描述12.設(shè)計(jì)思路13.軟件設(shè)計(jì)33.1設(shè)計(jì)步驟33.2界面設(shè)計(jì)63.3關(guān)鍵功能的實(shí)現(xiàn)94結(jié)論與心得體會(huì)165參考文獻(xiàn)176思考題177附錄187.1調(diào)試報(bào)告187.2測(cè)試結(jié)果207.3關(guān)鍵源代碼21多媒體播放器1. 基本功能描述多媒體播放軟件現(xiàn)在幾乎成為每一臺(tái)家用計(jì)算機(jī)的裝機(jī)必備軟件,比較流行的有迅雷播放器、Windows Media Player以及金山影霸等等,通過(guò)這些軟件能夠播放RM、RMVB、MP3、MPEG、DAT等多種格式的多媒體文件。這些商業(yè)軟件在功能上已經(jīng)做的相當(dāng)完備,也符合大多數(shù)普通消費(fèi)者的的胃口,但很多人電腦里總是安裝了多種播放器,因?yàn)椴煌牟シ牌饔胁煌?/p>

2、特點(diǎn),不是每個(gè)人都執(zhí)著于用一款播放器,所以設(shè)計(jì)一款符合自己使用習(xí)慣的播放器是很有可行性的。使用VC+6.0強(qiáng)大的MFC、AppWizard、Class Wizard和其中的多種控件可以很方便地建立各種應(yīng)用程序。同時(shí)想要實(shí)現(xiàn)更高級(jí)更復(fù)雜的功能,也可以借助ActiveX控件資源,用這些現(xiàn)有的控件資源,可以省去自己編程的復(fù)雜過(guò)程,從而實(shí)現(xiàn)更高級(jí)的功能。本次課程設(shè)計(jì)要使用VC+6.0自帶的一個(gè)ActiveX控件Windows Media Player控件,建立自己的多媒體播放器。此多媒體播放器具有打開(kāi)文件、播放、暫停、全屏、音量調(diào)節(jié)、快進(jìn)、快退等基本播放功能,并且可以播放:*.mp3,*.wma,*.

3、mdi,*.wav,*avi,*dat等格式的音頻視頻文件。同時(shí)還具有自制的可隱藏的播放列表,并且可以在播放模式中選擇順序播放、隨機(jī)播放、單曲循環(huán)三種方式隨機(jī)即模式放器具有打開(kāi)文件、播放、暫停、關(guān)閉,就是每個(gè)人都執(zhí)著與111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111。同時(shí),我也添加了保存列表的功能,當(dāng)下一次打開(kāi)時(shí)能保留上一次保存的播放列表,當(dāng)然也添加了刪除列表和刪除當(dāng)前的功能,更具人性化。2. 設(shè)計(jì)思路根據(jù)各個(gè)按鈕控件功能以及Windows Media

4、 Player控件的特點(diǎn),首先要在頭文件中將CWMPControl,CWMPSettings等類的對(duì)象的綁定以及定義,在后面的程序中需要調(diào)用這些類的成員函數(shù)。對(duì)于打開(kāi)文件按鈕,需要調(diào)用通用文件對(duì)話框類,并利用listbox中的AddString函數(shù)把選中的文件添加到播放列表中,在MFC學(xué)習(xí)中有涉及。對(duì)于一些基本的功能的實(shí)現(xiàn),如播放、暫停、全屏、音量增大、音量減小、靜音、快進(jìn)、快退等功能,主要調(diào)用CWMPControl和CWMPPlayer類中的成員函數(shù)來(lái)進(jìn)行實(shí)現(xiàn)。對(duì)于播放列表,這次設(shè)計(jì)使用了SetWindowPos函數(shù)來(lái)改變一個(gè)子窗口彈出的尺寸和方向,并一些相關(guān)的函數(shù)實(shí)現(xiàn)了保存列表、刪除列表、

5、刪除當(dāng)前的功能。對(duì)應(yīng)播放列表,我還添加了播放模式選擇的功能,提供了順序播放、隨即播放、單曲循環(huán)三種選擇。這當(dāng)中運(yùn)用的ontimer函數(shù)和settimer函數(shù)來(lái)控制播放模式。參照以上的設(shè)計(jì)開(kāi)始初始化打開(kāi)?設(shè)置文件類型過(guò)濾添加到播放列表YN讀取保存的播放列表播放播放控制播放模式退出?N退出Y思想,流程圖如圖1所示:圖1 流程圖3.軟件設(shè)計(jì)3.1設(shè)計(jì)步驟首先,打開(kāi)Microsoft Visual Studio6.0軟件,新建一個(gè)工程如圖2所示,以ZhuangWenfeng為工程名,然后將此工程定義為基于對(duì)話框的MFC應(yīng)用程序如圖3所示,點(diǎn)擊完成就成功建立了一個(gè)基于對(duì)話框的工程。圖2 工程建立圖3基于

6、對(duì)話框的MFC程序在建立好工程之后,首先是Windows Media Player控件的添加:建立空白對(duì)話框之后,在對(duì)話框的空白處單擊鼠標(biāo)右鍵,選擇Insert ActiveX Control菜單項(xiàng)。選擇Windows Media Player控件,如圖4所示。加入控件后,此時(shí)該控件與該對(duì)話框并沒(méi)有聯(lián)系,需要對(duì)其進(jìn)行變量的關(guān)聯(lián)。圖4 Windows Media Player控件的添加添加完該控件之后可以發(fā)現(xiàn),該控件與右邊控件工具欄添加的控件的形式與功能完全不同,是一種更為高級(jí)的控件,將該控件名改為IDC_player,如圖5所示。圖5 Windows Media Player控件雖然已已經(jīng)添加

7、了該控件,但是可以發(fā)現(xiàn),改控件沒(méi)有與工程中的對(duì)話框發(fā)生任何聯(lián)系,所以需要對(duì)其進(jìn)行變量的關(guān)聯(lián),所屬類為ZhuangWenfeng類,變量類型為CWPPlayer4如圖6所示。圖6 關(guān)聯(lián)變量關(guān)聯(lián)變量之后,才算是真正的添加完了該控件,可以發(fā)現(xiàn)在關(guān)聯(lián)變量之后,控件工具欄多了Windows Media Player控件的選項(xiàng),并且在Source Files中增加了17個(gè)類,相應(yīng)的頭文件也增加了17個(gè),如圖7所示。圖7 添加控件后的變化其中最主要的類為Cwmpplayer4,Cwmpcontrols,Cwmpmedia,Cwmpplaylist,Cwmpsettings五大類。Cwmpplayer4類主要

8、是關(guān)于對(duì)其他類的對(duì)象的調(diào)用以及基本的控件功能的實(shí)現(xiàn),提供了與Windows Media Player控件進(jìn)行交互的基本方法,其中部分成員函數(shù)還能夠進(jìn)一步獲取得到其他相關(guān)類對(duì)象的實(shí)例;Cwmpcontrols類主要是對(duì)控件的更多的操作;Cwmpmedia類主要是對(duì)于媒體文件資源的一些操作;Cwmpplaylist類主要是關(guān)于播放列表的操作;Cwmpsettings類主要是對(duì)于媒體文件中的一些基本設(shè)置的操作。對(duì)于該控件的添加以及內(nèi)部函數(shù)的理解需要較多時(shí)間熟悉,添加完此關(guān)鍵控件之后,進(jìn)行界面的設(shè)計(jì)。3.2界面設(shè)計(jì)首先是打開(kāi)按鈕,用于媒體文件的打開(kāi)。然后依次是,播放、暫停、全屏、快進(jìn)、快退、音量增大、

9、音量減小、靜音、播放停止、退出等按鈕。對(duì)其進(jìn)行變量的關(guān)聯(lián),以及ID的修改,修改結(jié)果如表1、表2所示:表1 控件ID以及關(guān)聯(lián)變量控件Caption按鈕ID關(guān)聯(lián)變量類型關(guān)聯(lián)變量名稱WMPlayerIDC_playerCWMPlayer4m_ZhuangWenfeng表2 控件ID以及對(duì)應(yīng)響應(yīng)函數(shù)控件Caption按鈕ID消息響應(yīng)函數(shù)打開(kāi)IDC_openOnopen播放IDC_playOnplay暫停IDC_pauseOnpause全屏IDC_fullscreenOnfullscreen播放列表IDC_listOnlist列表框IDC_LIST1OnDblclkList1快進(jìn)IDC_fastforw

10、ardOnfastforward快退IDC_fastreverseOnfastreverse+(音量增加)IDC_addvolOnaddvol-(音量減小)IDC_decvolOndecvol靜音IDC_muteOnmute表2 控件ID以及對(duì)應(yīng)響應(yīng)函數(shù)控件Caption按鈕ID消息響應(yīng)函數(shù)停止IDC_stopOnstop保存列表IDC_saveOnsave刪除列表IDC_dellistOndellist刪除當(dāng)前IDC_dellistcurOndellistcur退出IDC_exitOnexit關(guān)于IDC_aboutOnabout以上為有對(duì)應(yīng)控件的對(duì)象的關(guān)聯(lián),除了有對(duì)應(yīng)控件的,還需要有Wind

11、ows Media Player控件所生成的17個(gè)類中的幾個(gè)重要的類進(jìn)行對(duì)象的定義,而可知,對(duì)于成員對(duì)象的定義和成員函數(shù)的聲明都放在頭文件中,此次設(shè)計(jì)共主要用到其中3個(gè)類 ,因?yàn)樵O(shè)計(jì)了一個(gè)退出提醒彈出框,所以也要對(duì)其定義,具體如表3所示:表3 其他類及對(duì)應(yīng)對(duì)象類名對(duì)象名類名對(duì)象名CWMPControlsm_ControlCStringm_PathNameCWMPSettingsm_SettingCheckCCheck除了對(duì)各個(gè)控件關(guān)聯(lián)變量以及消息響應(yīng)函數(shù),還要對(duì)對(duì)話框類進(jìn)行消息響應(yīng)函數(shù)的關(guān)聯(lián),因?yàn)榇舜卧O(shè)計(jì)中添加了播放模式選擇的功能,所以需要用到WM_TIMER消息響應(yīng)函數(shù)以及SetTimer(

12、)和OnTimer()函數(shù)來(lái)實(shí)現(xiàn)這項(xiàng)功能,將對(duì)話框類進(jìn)行該消息響應(yīng)函數(shù)的關(guān)聯(lián)并書(shū)寫(xiě)程序。添加方法如圖8所示。圖8 添加WM_TIMER消息響應(yīng)函數(shù) 最終得到各個(gè)空間分布后的界面如圖9所示。圖9 多媒體播放器界面除了以上主對(duì)話框外,我還對(duì)ABOUTBOX進(jìn)行了重新設(shè)計(jì),也自制了一個(gè)Check對(duì)話框,其中ABOUTBOX如圖10所示。Check對(duì)話框是在用戶點(diǎn)擊退出按鈕自動(dòng)彈出的提醒窗口,主要用于防止用戶誤按關(guān)閉按鈕導(dǎo)致程序關(guān)閉,有利于用戶的使用,增強(qiáng)軟件的友好性,如圖11所示。圖10 修改后的ABOUTBOX對(duì)話框 圖11 提醒對(duì)話框 關(guān)于菜單的制作,首先,需要在ResourceView中加入資

13、源Menu,后增加對(duì)應(yīng)的菜單項(xiàng)以及菜單自己布局,下拉菜單則需要和按鈕關(guān)聯(lián),其方法是將其ID和按鈕的ID一樣,菜單布局圖12所示。圖 12 菜單欄3.3關(guān)鍵功能的實(shí)現(xiàn)對(duì)于各個(gè)函數(shù)的介紹,本文以關(guān)鍵代碼以及注釋的方式進(jìn)行介紹,首先介紹主對(duì)話框中函數(shù)的實(shí)現(xiàn)以及說(shuō)明:(1)Onopen();打開(kāi)函數(shù)void CZhuangWenfengDlg:Onopen() char szFileFilter="All File(*.*)|*.*|""AVI File(*.avi)|*.avi|""Mp3 File(*.mp3)|*.mp3|""

14、MPEG File(*.mpeg)|*.mpeg|""Media File(*.asf)|*.asf|""Video File(*.dat)|*.dat|""MPGA File(*.mpga)|*.mpga|""Wave File(*.wav)|*.wav|""Movie File(*.mov)|*.mov|""MidFile(*.mid;*,rmi)|*.mid;*.rmi|""WmaFile(*.wma)|*.wma|""Rmvb

15、File(*.rmvb)|*.rmvb|""All File(*.*)|*.*|" /可選的文件類型 CFileDialog dlg(true,NULL,NULL,OFN_HIDEREADONLY|OFN_ALLOWMULTISELECT|OFN_NOCHANGEDIR,szFileFilter); /OFN_ALLOWMULTISELECT是允許選擇多個(gè)文件 OFN_NOCHANGEDIR是不改變當(dāng)前目錄 POSITION pos=dlg.GetStartPosition(); if(dlg.DoModal()=IDOK) while(pos!=NULL) m_

16、pathname=dlg.GetNextPathName(pos);/得到完整的文件名,包括目錄名和擴(kuò)展名 m_list.AddString(m_pathname);/增加到播放列表 其中難點(diǎn)在于對(duì)于陌生函數(shù)的理解,由于類數(shù)目較多,各類又有各自不同的成員函數(shù),運(yùn)用起來(lái)比較困難。除了調(diào)用通用文件對(duì)話框和較為熟悉之外,其他的函數(shù)都是平時(shí)沒(méi)有見(jiàn)過(guò)的。播放列表中獲取路徑名是靠的添加主要依靠于GetNextPathName()函數(shù),而 m_list.AddString()函數(shù)是將項(xiàng)目名添加到播放列表中。 (2)Onlist();播放列表按鈕函數(shù)和OnDblclkList1();播放列表函數(shù): void

17、CZhuangWenfengDlg:Onlist() flag=!flag; if(!flag) SetWindowPos(NULL,0,0,400,430,SWP_NOMOVE);/播放列表初始位置狀態(tài)else SetWindowPos(NULL,0,0,590,430,SWP_NOMOVE);/點(diǎn)擊按鈕后播放列表位置狀態(tài)對(duì)于播放列表按鈕,設(shè)計(jì)在那的功能是運(yùn)行軟件時(shí)播放器的播放列表是隱藏的,當(dāng)點(diǎn)擊按鈕時(shí),播放列表彈出。為了實(shí)現(xiàn)這個(gè)功能,我將播放列表LIST1和播放列表按鈕關(guān)聯(lián)起來(lái),關(guān)系設(shè)為控制。為此,在程序定義了一個(gè)全局變量flag,將其設(shè)為一個(gè)標(biāo)志,在初始化時(shí)定義窗口無(wú)相對(duì)位移,當(dāng)點(diǎn)擊按鈕

18、是,窗口位移,因此就實(shí)現(xiàn)了播放列表的隱藏和出現(xiàn)的功能。而對(duì)于播放列表,則要求它實(shí)現(xiàn)雙擊播放功能,所以對(duì)列表控件增加一個(gè)消息映射,并選擇雙擊消息函數(shù)響應(yīng),如圖13所示。在其中編程時(shí)也加入了執(zhí)行響應(yīng)函數(shù)SetTimer(),當(dāng)點(diǎn)擊函數(shù)時(shí)就開(kāi)始創(chuàng)建計(jì)數(shù)器,以便實(shí)現(xiàn)播放模式的功能。圖13 播放列表消息映射函數(shù)設(shè)置 具體程序如下所示: void CZhuangWenfengDlg:OnDblclkList1();/雙擊播放函數(shù) CString str int index=m_list.GetCurSel();/獲取選擇的行數(shù) m_list.GetText(index,str); m_ZhuangWenf

19、eng.SetUrl(str);/播放 m_pathname=str; SetTimer(1,1000,NULL); /在點(diǎn)擊播放時(shí)就創(chuàng)建計(jì)時(shí)器 每隔1秒就自動(dòng)執(zhí)行下響應(yīng)函數(shù)ontimer() (3)Onplay();播放函數(shù)及其他多媒體播放控制按鈕void CZhuangWenfengDlg:Onplay() m_Control.play(); /暫停后繼續(xù)播放如同播放函數(shù)所示,其他控制播放狀態(tài)的函數(shù)都可以直接調(diào)用添加的控件的類的對(duì)象調(diào)用實(shí)現(xiàn),按鈕響應(yīng)函數(shù)和調(diào)用的函數(shù)關(guān)系如表4所示。表4響應(yīng)函數(shù)和調(diào)用函數(shù)關(guān)系響應(yīng)函數(shù)調(diào)用函數(shù)響應(yīng)函數(shù)調(diào)用函數(shù)Onfastreverse()m_Control.f

20、astReverse()Onfulscreen()m_ZhuangWenfeng.SetFullScreen(1)Onfastforward()m_Control.fastForward()Onmute()m_Setting.SetVolume(m_Setting.GetMute();Onstop()m_Control.stop()Onaddvol()m_Setting.SetVolume(m_Setting.GetVolume()+10)Onpause()m_Control.pause()Ondecvol()m_Setting.SetVolume(m_Setting.GetVolume()-

21、10(4)播放列表狀態(tài)這款播放器設(shè)計(jì)了保存播放列表、刪除播放列表、刪除當(dāng)前三種對(duì)播放列表狀態(tài)的控制,其中函數(shù)主要調(diào)用了m_list類中的函數(shù),在初始化是加入了一個(gè)讀取上次保存的播放列表的指針函數(shù),增加了播放列表的人性化。具體函數(shù)如下:void CZhuangWenfengDlg:Onsave() CStdioFile file;file.Open(".list.txt",CFile:modeCreate|CFile:modeReadWrite|CFile:typeText);/打開(kāi)指定文件for(int i=0;i<m_list.GetCount();i+) CStr

22、ing strtemp; m_list.GetText(i,strtemp); strtemp+="n" file.WriteString(strtemp);/保存播放列表 void CZhuangWenfengDlg:Ondellist() CStdioFile file; m_list.ResetContent();/刪除列表 file.Open(".list.txt",CFile:modeCreate);void CZhuangWenfengDlg:Ondellistcur() m_list.DeleteString(m_list.GetCurSe

23、l();/刪除當(dāng)前光標(biāo)所選擇的行Onsave();/自動(dòng)保存刪除某一行后的播放列表 (5)播放模式播放模式的選擇需要用到WM_TIMER消息如圖14所示,以及適時(shí)調(diào)用SetTimer()和OnTimer()函數(shù)。初始化時(shí)默認(rèn)設(shè)置為順序播放,當(dāng)雙擊播放時(shí)就開(kāi)始創(chuàng)建計(jì)數(shù)器,每1秒就執(zhí)行以下OnTimer函數(shù)。而OnTimer函數(shù)就會(huì)獲得播放狀態(tài),如果當(dāng)前的播放完了,就檢測(cè)單選按鈕在哪,從而選擇執(zhí)行哪個(gè)程序。如果是順序播放,就自動(dòng)執(zhí)行下一項(xiàng)目;如果是隨即播放,就在0-列表的文件數(shù)種產(chǎn)生一個(gè)隨即數(shù),然后執(zhí)行;而如果是單曲循環(huán),那么就一直執(zhí)行當(dāng)前文件。圖14 M_TIMER消息添加初始化程序如下:m_l

24、ist.SetCurSel(0);/選擇第一行m_list.GetText(m_list.GetCurSel(),m_pathname);(CButton *)GetDlgItem(IDC_RADIO1)->SetCheck(true);/默認(rèn)播放模式為順序播放 計(jì)數(shù)器函數(shù)OnTimer程序如下:void CZhuangWenfengDlg:OnTimer(UINT nIDEvent) int index=m_ZhuangWenfeng.GetPlayState();/獲取播放狀態(tài)if(index=1)/如果播放完成if(CButton *)GetDlgItem(IDC_RADIO1)-

25、>GetCheck()/如果是順序播放CString str;int index=m_list.GetCurSel()+1;if(index>=m_list.GetCount() index=0;/如果播放完最后一曲就自動(dòng)播放第一首m_list.GetText(index,str);m_ZhuangWenfeng.SetUrl(str);m_list.SetCurSel(index);/自動(dòng)置光標(biāo)/這樣就實(shí)現(xiàn)了順序播放if(CButton *)GetDlgItem(IDC_RADIO2)->GetCheck()/隨機(jī)播放srand(time(0);/目的在于每次都能產(chǎn)生不同的

26、隨機(jī)數(shù)序列m_list.SetCurSel(rand()%m_list.GetCount();/隨機(jī)選擇0-m_list.GetCount()-1的任意一個(gè)數(shù)即隨即選擇m_list里的文件m_list.GetText(m_list.GetCurSel(),m_pathname);m_ZhuangWenfeng.SetUrl(m_pathname);if(CButton *)GetDlgItem(IDC_RADIO3)->GetCheck()/單曲循環(huán)m_list.GetText(m_list.GetCurSel(),m_pathname);m_ZhuangWenfeng.SetUrl(m

27、_pathname);CDialog:OnTimer(nIDEvent); (6)Onabout()和Onexit()函數(shù)因?yàn)檎{(diào)用自身編輯的對(duì)話框并且修改了工程中的ABOUTBOX資源,所以也要對(duì)其進(jìn)行一定的修改。首先,是對(duì)Onabout()函數(shù)的修改:void CZhuangWenfengDlg:Onabout() CAboutDlg aboutDlg; aboutDlg.DoModal();其次,是對(duì)Onexit()函數(shù)的重載。對(duì)于添加自制的對(duì)話框,制作方面較為簡(jiǎn)單不作介紹,在此要介紹的是自制對(duì)話框的添加以及對(duì)應(yīng)類和頭文件的添加。在制作好對(duì)話框后,利用ClassWizard對(duì)該對(duì)話框進(jìn)行類

28、的關(guān)聯(lián),由于要調(diào)用該對(duì)話框,故要生成該對(duì)話框類自身的對(duì)象如圖15所示。圖14 生成自制對(duì)話框的新類選擇Create a new class后需要輸入一個(gè)類名CCheck,在輸入確定之后會(huì)在工程的FileView中增加一個(gè)對(duì)應(yīng)的Check.cpp和Check.h文件,之后便可以對(duì)該自制對(duì)話框類及其對(duì)象進(jìn)行操作。故調(diào)用該對(duì)話框的方法就是如下所示,在完成退出時(shí)還要?jiǎng)h除計(jì)數(shù)器,釋放內(nèi)存。void CZhuangWenfengDlg:Onexit() CCheck Check; /生成CCheckBox類的對(duì)象CheckBox if(Check.DoModal()=IDOK) /彈出對(duì)應(yīng)的模態(tài)對(duì)話框 C

29、Dialog:OnCancel(); /點(diǎn)擊確定則退出KillTimer(1);/退出程序時(shí)刪除計(jì)數(shù)器 (7)菜單欄的添加制作以及功能 菜單欄的制作和添加不難,只要將其對(duì)應(yīng)到對(duì)話框中即可,文中不再贅述。各個(gè)菜單中的菜單項(xiàng)的功能,只要將對(duì)應(yīng)的菜單項(xiàng)改成與對(duì)應(yīng)功能的按鈕控件的ID相同即可方便快速地實(shí)現(xiàn)。4結(jié)論與心得體會(huì)經(jīng)過(guò)一周的面向?qū)ο蟪绦蛘n程設(shè)計(jì),我學(xué)到了很多。在這一周的實(shí)際動(dòng)手學(xué)習(xí)中,我對(duì)VC+這門(mén)課程有了更深刻的認(rèn)識(shí),熟悉了用MFC 創(chuàng)建基于對(duì)話框的應(yīng)用程序,讓我對(duì)于MFC編程的方法有了更新更全面的認(rèn)識(shí)。這次課程設(shè)計(jì)我做了多媒體視頻播放器的設(shè)計(jì),播放器主要對(duì)常用的多媒體格式的文件實(shí)現(xiàn)播放和控

30、制。接觸題目開(kāi)始做后,同學(xué)們手中的VC+6.0都沒(méi)有Active Movie這一控件,只能選用Windows Media Player控件,而同時(shí)網(wǎng)上雖然有點(diǎn)關(guān)于Windows Media Player控件的資料,但按照網(wǎng)上的方法來(lái)添加控件并編程卻根本無(wú)法編譯。所以對(duì)于該控件的添加方法和編程基本是在摸索實(shí)踐中出來(lái)的。C+作為我們的主要專業(yè)課程之一,開(kāi)始覺(jué)得那些程序枯燥無(wú)味,但在這次課程設(shè)計(jì)后我發(fā)現(xiàn)在自己一點(diǎn)一滴的努力中對(duì)C+程序的興趣也在增加。可是在制作的過(guò)程中,編程總是運(yùn)行錯(cuò)誤成為了我非常大的困難之一,常常在悉心時(shí)久的編程后,運(yùn)行出現(xiàn)錯(cuò)誤,往往是越改越錯(cuò),導(dǎo)致此段代碼需要重新編寫(xiě),但在前面代

31、碼的不斷出錯(cuò)與修改的同時(shí),我們也學(xué)到了更多,領(lǐng)悟到了上課所沒(méi)有領(lǐng)會(huì)的知識(shí)點(diǎn),所以在后面的編程中就越編越順。在程序設(shè)計(jì)時(shí)不要妄想一次就將整個(gè)程序設(shè)計(jì)好,反復(fù)修改,不斷改進(jìn)是程序設(shè)計(jì)的必經(jīng)之路。最終終于順利完成了本人所想實(shí)現(xiàn)的大部分功能,掌握了一個(gè)全新的類的部分功能的使用,感覺(jué)受益匪淺,但也由于本人能力有限,才疏學(xué)淺,很多地方還有疏漏,沒(méi)有實(shí)現(xiàn)一些想要實(shí)現(xiàn)的功能。最后,我覺(jué)的做 C+語(yǔ)言課程設(shè)計(jì)是十分有意義的,而且是十分有必要的,我們?cè)谡n堂上掌握的只是專業(yè)課的理論知識(shí),而這次課程設(shè)計(jì)為我們提供了很好的實(shí)踐平臺(tái)。讓我們?cè)鰪?qiáng)了動(dòng)手編程,自己調(diào)試,尋找錯(cuò)誤的能力,為以后進(jìn)一步的學(xué)好 C+語(yǔ)言提供了基礎(chǔ)。

32、5參考文獻(xiàn)1周長(zhǎng)發(fā).Visual C+.NET多媒體編程M.電子工業(yè)出版社.20022揣錦華.面向?qū)ο蟪绦蛟O(shè)計(jì)與VC+實(shí)踐M.西安電子科技大學(xué)出版社.20053鄭阿奇.Visual C+教程M.北京:機(jī)械工業(yè)出版社.20044Steve Mack.流媒體寶典.電子工業(yè)出版社.20035老虎工作室.舉一反三Visual C+程序設(shè)計(jì)實(shí)戰(zhàn)訓(xùn)練M.北京:人民郵電出版社.20046思考題1、控件自帶的類和本程序中的類是如何共同作用的?答:首先,控件中的類必然會(huì)在對(duì)話框的主程序中被調(diào)用,那么就要在主程序中#include入對(duì)應(yīng)類的頭文件;然后對(duì)需要用到的類生成對(duì)應(yīng)的對(duì)象以實(shí)現(xiàn)類中函數(shù)的使用。在完成控件自

33、帶類的函數(shù)在程序中的使用之后,還需要調(diào)用對(duì)話框自身的函數(shù),比如WM_TIMER消息及消息響應(yīng)函數(shù)OnTimer()等函數(shù),以及各控件對(duì)應(yīng)的消息響應(yīng)函數(shù),并且OnInitDialog()函數(shù)等也需要做一些改動(dòng),添加一些與控件類有關(guān)的函數(shù)。如此便可以實(shí)現(xiàn)控件自帶類和本程序中的類的共同作用。2、說(shuō)明程序中調(diào)用的控件函數(shù)的作用?答:各控件有不同的函數(shù)對(duì)應(yīng),分別實(shí)現(xiàn)不同功能,分別為:表5 調(diào)用的空間函數(shù)的作用功能控件函數(shù)功能控件函數(shù)打開(kāi)Onopen()+(音量增大)Onaddvol()播放Onplay()-(音量減?。㎡ndecvol()暫停Onpause()靜音Onmute()停止Onstop()退出

34、Onexit()播放列表Onlist()保存列表Onsave()快進(jìn)Onfastforward()刪除列表Ondellist()快退Onfastreverse()刪除當(dāng)前Ondellistcur()全屏Onfullscreen()關(guān)于Onabout()7附錄7.1調(diào)試報(bào)告在設(shè)計(jì)過(guò)程中出現(xiàn)了許多錯(cuò)誤,利用VC+6.0中的編譯器進(jìn)行錯(cuò)誤的查找,根據(jù)提示的錯(cuò)誤,對(duì)處錯(cuò)誤進(jìn)行改正。小錯(cuò)誤較多在此不贅述,都是一些與未加對(duì)應(yīng)頭文件,未定義正確變量名有關(guān)的小錯(cuò)誤,也較容易糾正,下文將敘述調(diào)試過(guò)程中的錯(cuò)誤以及改正辦法(1)問(wèn)題一在設(shè)計(jì)播放列表時(shí),當(dāng)雙擊播放列表里的成員時(shí)并沒(méi)有播放文件,當(dāng)時(shí)一直修改代碼卻沒(méi)有得

35、到改變,以至于一段時(shí)間后用了一個(gè)按鈕代替了雙擊播放的功能如圖15所示。圖15 調(diào)試結(jié)果1后來(lái)又覺(jué)得不甘心,所以就一直找資料,最后在網(wǎng)上的資料里學(xué)到了解決這個(gè)問(wèn)題的方法。實(shí)現(xiàn)雙擊播放功能要先對(duì)播放列表增加一個(gè)雙擊消息映射函數(shù)OnDblclkList1(),然后再編代碼,這樣就實(shí)現(xiàn)雙擊播放的功能。 (2)問(wèn)題二圖16 類綁定此段程序在OnInitDialog()函數(shù)中,連接編譯都未報(bào)錯(cuò),但是播放、暫停等多個(gè)按鈕控件無(wú)法工作。后考慮到其他類都進(jìn)行了的類的綁定,所以也要對(duì)CWMPControls類進(jìn)行綁定,其中static_cast相當(dāng)于將某一對(duì)象和賦值符號(hào)右邊的值進(jìn)行綁定,由于是靜態(tài)綁定,故綁定后不

36、再改變,而后續(xù)程序中出現(xiàn)的m_Control對(duì)象卻并未出現(xiàn)對(duì)應(yīng)的綁定,如圖16所示。添加代碼:m_Control = static_cast<CWMPPlaylist>(m_WMPlayer.GetCurrentControl();之后,后續(xù)的控件的操作可以正常進(jìn)行了。 (3)問(wèn)題三 對(duì)于停止按鈕編程時(shí),一開(kāi)始直接調(diào)用了m_Control.stop函數(shù),如圖17所示,但調(diào)試時(shí)當(dāng)點(diǎn)擊停止按鈕時(shí),本次播放時(shí)停止了但是緊接著卻繼續(xù)播放下一曲目。后來(lái)經(jīng)過(guò)分析發(fā)現(xiàn),原來(lái)是計(jì)數(shù)函數(shù)的問(wèn)題,由于添加了播放模式的功能,當(dāng)停止時(shí)計(jì)數(shù)器并沒(méi)有停止工作,當(dāng)下一輪響應(yīng)時(shí)就執(zhí)行了繼續(xù)播放的功能,所以后來(lái)又加

37、了一句刪除計(jì)數(shù)器的代碼:KillTimer(1),如圖18所示,問(wèn)題就得到了解決。圖17 原來(lái)的代碼 圖18 修改后的代碼 (4)問(wèn)題四 在設(shè)計(jì)退出按鈕是想要設(shè)計(jì)一個(gè)退出提醒功能,為了防止用戶在使用時(shí)不小心因?yàn)榘村e(cuò)而誤關(guān)程序,一開(kāi)始一直不得要領(lǐng),后來(lái)經(jīng)過(guò)詢問(wèn)同學(xué)得到了想要的答案,那新添加一個(gè)對(duì)話框,然后新建一個(gè)類,在增加一個(gè)頭文件#include "Check.h",然后再進(jìn)行編程,具體實(shí)現(xiàn)功能如圖19所示。圖19 退出提醒功能7.2測(cè)試結(jié)果圖20 運(yùn)行時(shí)讀取上一次保存的播放列表 圖21視頻播放暫停、全屏、音量功能等圖22 剛運(yùn)行時(shí)隱藏播放列表 圖23 關(guān)于對(duì)話框圖24 菜

38、單功能 圖25 退出提醒框7.3關(guān)鍵源代碼 在頭文件處,如下添加:#include "wmpcontrols.h" /用到 wmpcontrols對(duì)象中的函數(shù)#include "wmpplayer4.h"#include "wmpsettings.h"#include "Check.h"/退出時(shí)彈出框提醒 定義全局變量如下:int flag;/全局變量CString m_pathname; 在初始化對(duì)話框函數(shù)OnInitDialog(),如下添加: SetWindowPos(NULL,0,0,400,430,SWP

39、_NOMOVE);/無(wú)相對(duì)移動(dòng) 播放列表收縮m_list.SetHorizontalExtent(1000);/設(shè)置列表框可水平滾動(dòng)的寬度到最大CStdioFile *fsp=new CStdioFile(".list.txt",CFile:modeRead);/讀取保存的播放列表的 list.txt 文件CString str;while(fsp->ReadString(str)m_list.AddString(str);fsp->Close();delete fsp;m_list.SetCurSel(0);/選擇第一行m_list.GetText(m_lis

40、t.GetCurSel(),m_pathname);(CButton *)GetDlgItem(IDC_RADIO1)->SetCheck(true);/默認(rèn)播放模式為順序播放m_Control = static_cast<CWMPControls>(m_ZhuangWenfeng.GetControls();m_Setting=m_ZhuangWenfeng.GetSettings();在主體函數(shù)部分,如下添加: void CZhuangWenfengDlg:Onopen() char szFileFilter="All File(*.*)|*.*|"

41、"AVI File(*.avi)|*.avi|" "Mp3 File(*.mp3)|*.mp3|" "MPEG File(*.mpeg)|*.mpeg|" "Media File(*.asf)|*.asf|" "Video File(*.dat)|*.dat|" "MPGA File(*.mpga)|*.mpga|" "Wave File(*.wav)|*.wav|" "Movie File(*.mov)|*.mov|" "M

42、id File(*.mid;*,rmi)|*.mid;*.rmi|" "Wma File(*.wma)|*.wma|""Rmvb File(*.rmvb)|*.rmvb|" "All File(*.*)|*.*|"/可選的文件類型 CFileDialog dlg(true,NULL,NULL,OFN_HIDEREADONLY|OFN_ALLOWMULTISELECT|OFN_NOCHANGEDIR,szFileFilter); /OFN_ALLOWMULTISELECT是允許選擇多個(gè)文件 OFN_NOCHANGEDIR是不改

43、變當(dāng)前目錄 POSITION pos=dlg.GetStartPosition(); if(dlg.DoModal()=IDOK) while(pos!=NULL) m_pathname=dlg.GetNextPathName(pos);/得到完整的文件名,包括目錄名和擴(kuò)展名 m_list.AddString(m_pathname);/增加到播放列表 void CZhuangWenfengDlg:Onlist() flag=!flag; if(!flag) SetWindowPos(NULL,0,0,400,430,SWP_NOMOVE);/播放列表初始位置狀態(tài)elseSetWindowPos

44、(NULL,0,0,590,430,SWP_NOMOVE);/點(diǎn)擊按鈕后播放列表位置狀態(tài)void CZhuangWenfengDlg:OnDblclkList1() /雙擊播放函數(shù) CString str; int index=m_list.GetCurSel();/獲取選擇的行數(shù) m_list.GetText(index,str); m_ZhuangWenfeng.SetUrl(str);/播放 m_pathname=str; SetTimer(1,1000,NULL); /在點(diǎn)擊播放時(shí)就創(chuàng)建計(jì)時(shí)器 每隔1秒就自動(dòng)執(zhí)行下響應(yīng)函數(shù)ontimer()void CZhuangWenfengDlg:

45、Onplay() m_Control.play(); /暫停后繼續(xù)播放void CZhuangWenfengDlg:Onsave() CStdioFile file; file.Open(".list.txt",CFile:modeCreate|CFile:modeReadWrite|CFile:typeText); for(int i=0;i<m_list.GetCount();i+) CString strtemp; m_list.GetText(i,strtemp); strtemp+="n" file.WriteString(strtemp

46、);/保存播放列表 void CZhuangWenfengDlg:Onexit() CCheck Check; /生成CCheck類的對(duì)象Checkif(Check.DoModal()=IDOK)/彈出對(duì)應(yīng)的模態(tài)對(duì)話框CDialog:OnCancel();/退出KillTimer(1);/退出程序時(shí)刪除計(jì)數(shù)器void CZhuangWenfengDlg:Ondellist() CStdioFile file;m_list.ResetContent();/刪除列表file.Open(".list.txt",CFile:modeCreate);void CZhuangWenfengDlg:Ondellistcur() m_l

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論