版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、<p><b> 軟件工程課程設(shè)計</b></p><p> 題 目 多媒體播放器</p><p><b> 目 錄</b></p><p> 0 任務(wù)書 ………………………………………………… </p><p> 1 需求分析 …………………………………………
2、…… 1</p><p> 2 總體設(shè)計 ……………………………………………… 1</p><p> 2.1 ActiveMovie控件概述 ……………………………… 1</p><p> 2.2軟件的總體架構(gòu) ……………………………………… 2</p><p> 2.3開發(fā)工具 ……………………………………………… 2
3、</p><p> 3 詳細設(shè)計 ……………………………………………… 3</p><p> 3.1類的說明 ……………………………………………… 3</p><p> 3.2全局變量 ……………………………………………… 6</p><p> 3.3主要函數(shù)說明及其函數(shù)流程圖 ……………………… 6</p>
4、<p> 4 程序運行與測試 ……………………………………… 13</p><p> 4.1測試方法 ……………………………………………… 13</p><p> 4.2程序運行和測試結(jié)果 ………………………………… 14</p><p> 5 總結(jié) …………………………………………………… 18</p><p> 《
5、軟件工程》課程設(shè)計</p><p><b> 任 務(wù) 書</b></p><p> 多媒體播放器程序的設(shè)計與實現(xiàn)</p><p> 目的:利用VC++開發(fā)一個支持mp3、wma、wmv、avi、mpg等不同音頻、視頻格式的多媒體播放器。通過課程設(shè)計掌握多媒體編程的基本原理。</p><p><b>
6、 任務(wù):</b></p><p> 編程實現(xiàn)一個可支持多種音視頻格式的多媒體播放器,其基本功能包括媒體播放、音量調(diào)節(jié)、播放進度選擇、暫停、停止以及歌曲信息的查詢與添加等。</p><p> 給出程序的總體設(shè)計和詳細設(shè)計,要求程序總體架構(gòu)圖、詳細設(shè)計的流程圖,函數(shù)、變量說明等。</p><p> 給出程序運行、測試的詳細結(jié)果。</p>
7、<p><b> 多媒體播放器</b></p><p><b> 需求分析</b></p><p> 現(xiàn)代電子科學(xué)計算機的發(fā)展給社會帶來很大的變化,人們的生活發(fā)生了很大的變化。家用型電子計算機幾乎進了每家每戶,滿足了人們生活的各種需要,而這更歸功與各種各樣的計算機軟件的出現(xiàn)。多媒體播放器也是其中非常重要的一員。</p>
8、<p> 多媒體是一種新型的信息處理與傳播技術(shù)。它的出現(xiàn)曾經(jīng)經(jīng)歷過巨大的坎坷,但是卻不影響它給整個社會帶來深遠的影響,有人還認為它是信息及其傳輸媒介方面的一場根本革命。自從多媒體技術(shù)廣泛推廣后,人們在網(wǎng)上瀏覽網(wǎng)頁時有了豐富多彩的音樂、影片,在家也能觀看電影、電視劇等等。人們也對新的技術(shù)有了更多的渴望、歡迎、認識和遠見,計算機多媒體技術(shù)的功能在商業(yè)、文化娛樂和教育等方面的應(yīng)用效果明顯,前景廣闊。然而多媒體播放器的開發(fā)仍然不
9、能滿足人們的需求,多媒體文件格式多樣,但卻沒有一款播放器能滿足多有格式的解碼。人們渴望解碼能力更強大,功能更加完備的多媒體播放器。</p><p> 本文采用VC++6.0作為開發(fā)工具,設(shè)計并實現(xiàn)了一個簡單的多媒體播放器,支持mp3、wma、wmv、avi、mpg、rmvb等主流音頻和視頻格式的媒體文件的播放。同時,本多媒體播放器實現(xiàn)了媒體文件的打開、關(guān)閉、播放、暫停、停止、音量、左右聲道、播放進度的顯示和控制
10、等功能,基本實現(xiàn)了軟件工程課程設(shè)計的功能點要求。</p><p><b> 總體設(shè)計</b></p><p> ActiveMovie控件概述</p><p> ActiveMovie控件是微軟公司推出的用于多媒體程序設(shè)計的可視動畫ActiveX控件,由于該控件內(nèi)嵌了Microsoft MPEG音頻解碼器和Microsoft MPEG視頻
11、解碼器,能支持多種文件格式,從最常見的WAV文件和AVI文件到使用MPEG壓縮格式的VCD視頻文件,都可以正常的進行播放。控件能根據(jù)文件后綴進行自動判別設(shè)備類型,并完成相應(yīng)的控制。因此,若正在編寫的應(yīng)用程序需要提供多媒體支持,那么使用ActiveMovie控件是一個很好的主意。事實上,很多優(yōu)秀的多媒體應(yīng)用程序,其內(nèi)部的多媒體回放就是利用ActiveMovie控件來實現(xiàn)。只要精心地設(shè)計應(yīng)用程序的用戶界面,我們一樣可以開發(fā)出功能齊全、外觀漂
12、亮、具有相當(dāng)水準(zhǔn)的多媒體播放器。而且,在Windows 95/98和Windows NT的最新版本中,ActiveMovie控件已作為操作系統(tǒng)的一部分來提供,即使用戶系統(tǒng)中沒有安裝ActiveMovie控件,Microsoft的許可協(xié)議也允許在你的應(yīng)用程序的發(fā)行包中發(fā)布ActiveMovie的運行時文件。</p><p> 可視動畫控件ActiveMovie Control Object為程序員提供了在該層次上
13、控制媒體設(shè)備接口的能力,它包含一組高層次的獨立于設(shè)備的命令,可以控制音頻和視頻外設(shè),我們不必關(guān)心具體的設(shè)備便可以對CD、視盤機、波形音頻設(shè)備、視頻播放設(shè)備和MIDI設(shè)備等媒體設(shè)備進行控制,也可以理解成設(shè)備面板上的一排按鍵,通過選擇不同的按鍵(發(fā)送不同的命令)即可讓設(shè)備完成各種功能,而不必關(guān)心設(shè)備的內(nèi)部實現(xiàn)。因此,程序員本身可以不用關(guān)心控件是怎么完成多媒體文件的解碼、怎么將解碼后的視頻信息呈現(xiàn)在播放區(qū)上、怎么將解碼后的聲音信息呈現(xiàn)在揚聲器
14、上等等,而僅僅需要調(diào)用相應(yīng)已經(jīng)封裝好的函數(shù)(或接口),來完成文件的加載控制、媒體文件的解碼控制、媒體文件的播放控制、媒體文件的播放區(qū)控制、媒體文件的聲音控制、程序的差錯控制等等。本多媒體播放器正是基于ActiveMovie控件的基礎(chǔ)進行了軟件本身的開發(fā),借助與ActiveMovie本身強大的解碼功能,并通過控件對外提供的良好接口來實現(xiàn)多媒體文件的播放和控制。</p><p><b> 軟件的總體架構(gòu)&
15、lt;/b></p><p> 控件是現(xiàn)代軟件開發(fā)過程中必不可少的軟件要素,自然有效的使用現(xiàn)成的控件不但可以縮短開發(fā)周期,也極大的降低了軟件開發(fā)人員的工作量。本多媒體播放正是基于ActiveMovie Control Object控件實現(xiàn)的,當(dāng)然也包含其他控件(例如菜單、滑塊、按鈕等等),但是前者是整個播放器的核心控件,由該控件完成了由其他控件加載的多媒體文件的解碼,以及完成由其他控件提交的控制信息的響應(yīng)
16、。所以軟件本身實現(xiàn)了對多個控件的功能的有效整合,通過這樣的方式來完成整個多媒體播放器的功能。</p><p> 軟件的總體架構(gòu)參看下面圖2.2。</p><p><b> 圖2.2</b></p><p><b> 開發(fā)工具</b></p><p> Visual C++6.0是微軟公司推出
17、的開發(fā)Win32應(yīng)用程序(Windows 95/98/2000/XP/NT)的、面向?qū)ο蟮目梢暬晒ぞ?。它的最大?yōu)點就是提供了功能強大的MFC類庫,MFC是一個很大的C++類層次結(jié)構(gòu),其中封裝了大量的類及其函數(shù),很多Windows程序所共有的標(biāo)準(zhǔn)內(nèi)容可以由MFC的類來提供,MFC類為這些內(nèi)容提供了用戶接口的標(biāo)準(zhǔn)實現(xiàn)方法,程序員所要做的就是通過預(yù)定義的接口把具體應(yīng)用程序特有的東西填入這個輪廓,這將簡化編程工作,大大的減少程序員編寫的代碼
18、數(shù)量,使編程工作變得更加輕松容易。</p><p> 本程序正是在VC++6.0集成開發(fā)環(huán)境下開發(fā),使用了功能強大的MFC類庫,以及借助了及其方便的可視化開發(fā)方法。</p><p><b> 詳細設(shè)計</b></p><p><b> 類的說明</b></p><p> 在按照工作向?qū)В瓿?/p>
19、一個MFC軟件工程的建立之后,VC就自動為我們創(chuàng)建了三個基本的類。程序中為了完成對音量的大小和左右聲道平衡的控制,我又專門為此添加了一個類,并指向音量控制窗口。下面對程序中用到的類概要說明。</p><p> class CCTLY2412App : public CwinApp</p><p> 該類由工程向?qū)ё詣觿?chuàng)建,用于維護整個進程,以及完成對進程的控制,在類當(dāng)中包含一個構(gòu)造函數(shù)
20、CCTLY2412App()(用于創(chuàng)建一個實例)和一個由父類繼承的虛函數(shù)virtual BOOL InitInstance()(用于初始化一個實例)。播放器的主要功能實現(xiàn)并不是在該類下,因此并未對該類下的屬性和方法進行修改,它仍然保持默認的形式。</p><p> class CAboutDlg : public Cdialog</p><p> 程序的幫助窗口,用于顯示程序的幫助信息
21、,本程序中用于顯示有關(guān)程序的信息,主要是對幫助窗口的顯示界面進行了修改,類的主體仍然是保持默認的形式。</p><p> class CCTLY2412Dlg : public Cdialog</p><p> 該類是整個程序的重點,維護著主窗口下面的所有變量和函數(shù)、以及與主窗口有關(guān)的消息和消息響應(yīng)函數(shù)。</p><p><b> 該類的聲明如下:&
22、lt;/b></p><p> class CCTLY2412Dlg : public CDialog</p><p><b> {</b></p><p> // Construction</p><p><b> public:</b></p><p>
23、CCTLY2412Dlg(CWnd* pParent = NULL);// standard constructor</p><p> // Dialog Data</p><p> //{{AFX_DATA(CCTLY2412Dlg)</p><p> enum { IDD = IDD_CTLY2412_Dialog };</p><p
24、> CActiveMoviem_AMovie; </p><p> CRectm_RecInitAMovie; //保存文件未被加載時,控件的初始大小</p><p> CRectm_RecAMovie; //正在運行的控件的初始大小,用于播放區(qū)大小調(diào)整時使用</p><p> //}}AFX_DATA</p><
25、;p> // Overrides</p><p> // ClassWizard generated virtual function overrides</p><p> //{{AFX_VIRTUAL(CCTLY2412Dlg)</p><p> protected:</p><p> virtual void DoDat
26、aExchange(CDataExchange* pDX);// DDX/DDV support</p><p> //}}AFX_VIRTUAL</p><p> /////////////////////**************/////////////////////</p><p> void InitMoveWindow();</p>
27、;<p> void MoveMovieWindow();</p><p> void OnReadyStateChangeAmovie(long ReadyState);</p><p> CActiveMovie* getCActiveMovie();</p><p> /////////////////////************
28、**/////////////////////</p><p> // Implementation</p><p> protected:</p><p> HICON m_hIcon;</p><p> // Generated message map functions</p><p> //{{AFX
29、_MSG(CCTLY2412Dlg)</p><p> virtual BOOL OnInitDialog();</p><p> afx_msg void OnSysCommand(UINT nID, LPARAM lParam);</p><p> afx_msg void OnPaint();</p><p> afx_msg
30、HCURSOR OnQueryDragIcon();</p><p> afx_msg void OnStateChangeAmovie(long oldState, long newState);</p><p> afx_msg void OnFileOpen();</p><p> afx_msg void OnFileClose();</p>
31、;<p> afx_msg void OnFileExit();</p><p> afx_msg void OnPlayStart();</p><p> afx_msg void OnPlayPause();</p><p> afx_msg void OnPlayStop();</p><p> afx_msg
32、void OnVideo1x();</p><p> afx_msg void OnVideo2x();</p><p> afx_msg void OnVideoFullScreen();</p><p> afx_msg void OnHelpAbout();</p><p> afx_msg void OnAudeoVolume
33、();</p><p> afx_msg void OnCancelMode();</p><p> afx_msg void OnCaptureChanged(CWnd *pWnd);</p><p> afx_msg void OnOpenCompleteAmovie();</p><p> afx_msg void OnClic
34、kAmovie();</p><p> DECLARE_EVENTSINK_MAP();</p><p> //}}AFX_MSG</p><p> DECLARE_MESSAGE_MAP()</p><p><b> };</b></p><p> 該類下有三個成員變量,如下所示。&l
35、t;/p><p> CactiveMoviem_Amovie :</p><p> 該成員變量用于維持主窗口中的由ActiveMovie 控件實例化產(chǎn)生的對象,在主窗口運行期間,用戶打開的文件的加載到ActiveMovie 控件、已加載了文件的ActiveMovie (控件)的播放、暫停、停止、音量控制等等都需要通過該對象的成員函數(shù)來完成。因此該對象非常重要。在函數(shù)說明中還將繼續(xù)對該對象
36、的成員函數(shù)進行說明。</p><p> CRect m_RecInitAMovie :</p><p> 在主窗口創(chuàng)建后,主窗口的用戶區(qū)還會嵌入ActiveMovie 控件的播放區(qū),這個還未加載播放文件的播放區(qū)對窗口的調(diào)整非常重要,因此專門用此變量存放ActiveMovie 控件播放區(qū)的矩形區(qū)域。為加載視頻文件后的窗口調(diào)整和關(guān)閉視頻文件后的窗口恢復(fù)到默認狀態(tài)下提供參考數(shù)據(jù)。這里
37、說明一下,播放器只有在加載視頻文件后,才會對播放區(qū)進行相應(yīng)的調(diào)整,以使窗口的大小能夠適應(yīng)播放區(qū)的大小,在再打開視頻文件后會重新對窗口大小進行調(diào)整,在關(guān)閉視頻文件后,窗口會恢復(fù)到默認的窗口大小,而音頻文件的播放正是在默認窗口大小下。而m_RecInitAMovie中的數(shù)據(jù)正是恢復(fù)初始化窗口大小所需要的。</p><p> CRect m_RecAMovie :</p><p>
38、播放器設(shè)置了調(diào)整播放區(qū)的功能,而由于ActiveMovie控件的特性,在我們對播放區(qū)進行調(diào)整的時候后必須保存原始播放區(qū)的大小,因此需要在設(shè)置一個這樣的成員變量。</p><p> class CCVolumeDlg : public Cdialog</p><p> 該類是后面添加的。播放器設(shè)計的時候?qū)⒙曇暨M行單獨的控制,聲音的調(diào)節(jié)通過彈出的“聲音調(diào)節(jié)器”來完成。因此該類的設(shè)計就是為了
39、維護“聲音交接器”,來完成聲音音量的調(diào)節(jié),聲音左右聲道的調(diào)節(jié),以及音量大小和左右聲道值的實時顯示等。</p><p><b> 該類的聲明如下:</b></p><p> class CCVolumeDlg : public CDialog</p><p><b> {</b></p><p>
40、; // Construction</p><p><b> public:</b></p><p> CCVolumeDlg(CWnd* pParent = NULL); // standard constructor</p><p> // Dialog Data</p><p> //{{AFX_DA
41、TA(CCVolumeDlg)</p><p> enum { IDD = IDD_DIALOG_Volume };</p><p> CActiveMovie*m_pAMovie;</p><p> CSliderCtrlm_Volume1;</p><p> CSliderCtrlm_Volume2;</p>
42、<p> //}}AFX_DATA</p><p> BOOL OnInitDialog(); //初始化滑塊</p><p> void SetCActiveMovie(CActiveMovie*); //傳入CactiveMovie實例對象的地址</p><p> // Overrides</p><p> //
43、 ClassWizard generated virtual function overrides</p><p> //{{AFX_VIRTUAL(CCVolumeDlg)</p><p> protected:</p><p> virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV s
44、upport</p><p> //}}AFX_VIRTUAL</p><p> // Implementation</p><p> protected:</p><p> // Generated message map functions</p><p> //{{AFX_MSG(CCVolumeDlg
45、)</p><p> afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);</p><p> afx_msg void OnCancelMode();</p><p> afx_msg void OnCaptureChanged(CWnd *pWnd);</p&g
46、t;<p> //}}AFX_MSG</p><p> DECLARE_MESSAGE_MAP()</p><p><b> };</b></p><p> 類中有三個添加的成員變量,如下所示。</p><p> CActiveMovie*m_pAMovie :</p><p
47、> 要完成對聲音的控制,就要完成對主窗口中ActiveMovie控件進行控制,我們需要調(diào)用ActiveMovie對象的成員函數(shù),因此在創(chuàng)建CCVolumeDlg實例對象的時候,需要從主窗口中傳入ActiveMovie控件的實例對象到CactiveMovie實例對象中,而m_pAMovie指針就指向這個調(diào)節(jié)音量、得到音量需要用的到的ActiveMovie控件的實例對象地址。</p><p><b>
48、; 全局變量</b></p><p> CCTLY2412App theApp</p><p> 播放器有一個默認的全局變量CCTLY2412App theApp ,用于維持程序?qū)嵗蟮倪M程對象,但是程序中添加的類和函數(shù)都未對該成員變量進行任何的操作,因此這里不進行詳細的說明。</p><p> 主要函數(shù)說明及其函數(shù)流程圖</p>
49、<p> class CaboutDlg成員函數(shù)</p><p> BOOL CCTLY2412Dlg::OnInitDialog()</p><p> 該函數(shù)是類在初始化時必須要調(diào)用的函數(shù),主要完成一些初始化工作,主要流程都是類在添加的時候自動填入的。但是這里需要補充的是,在該函數(shù)中添加了一些自定義的初始化操作。如下面所示,操作說明在注釋中已經(jīng)給出。</p>
50、<p> /////////////////////**************/////////////////////</p><p> // 設(shè)置 ActiveMovie 控件的初始文件為空</p><p> m_AMovie.SetFileName("");</p><p> m_AMovie.GetWindowRe
51、ct(m_RecInitAMovie); // 得到 ActiveMovie 控件的大小</p><p> // 文件未被加載時,窗口的大小</p><p> InitMoveWindow(); //主窗口初始化</p><p> CenterWindow(CWnd::GetDesktopWindow()); //將窗口置于屏幕中央</p>
52、<p> /////////////////////**************/////////////////////</p><p> void CCTLY2412Dlg::InitMoveWindow()</p><p> 完成主窗口的初始化工作,在初始化中將主窗口顯示設(shè)置成默認的顯示狀態(tài),或者將主窗口恢復(fù)到默認的顯示狀態(tài)。</p><p>
53、<b> 函數(shù)代碼如下所示:</b></p><p> void CCTLY2412Dlg::InitMoveWindow(){</p><p> CRect rct,rctclnt;</p><p> GetWindowRect(rct); //獲取窗口大小</p><p> GetClientRect
54、(rctclnt); //獲取內(nèi)容大小</p><p> MoveWindow(rct.left,rct.top,m_RecInitAMovie.Width()+(rct.Width()-rctclnt.Width())/2,m_RecInitAMovie.Height()+rct.Height()-rctclnt.Height()); //控件的位置、大小調(diào)整</p><p>
55、 m_AMovie.MoveWindow(0,0, m_RecInitAMovie.Width(),m_RecInitAMovie.Height()); //控件的位置、大小調(diào)整</p><p><b> }</b></p><p> void CCTLY2412Dlg::MoveMovieWindow()</p><p> 函數(shù)完成
56、主窗口的調(diào)整,當(dāng)用戶加載了媒體文件后,需要對用戶區(qū)窗口進行調(diào)整,若為音頻文件則恢復(fù)到默認顯示狀態(tài),若為視頻文件,則根據(jù)視頻的播放區(qū)大小調(diào)整窗口大小。</p><p><b> 函數(shù)代碼如下所示:</b></p><p> void CCTLY2412Dlg::MoveMovieWindow(){</p><p> if(0==m_AMov
57、ie.GetImageSourceWidth()||0==m_AMovie.GetImageSourceHeight())</p><p> InitMoveWindow();</p><p><b> else</b></p><p><b> {</b></p><p> CRect r
58、cDlgWnd,rcDlgClnt;</p><p> GetWindowRect(rcDlgWnd); // 獲得對話框的大小</p><p> GetClientRect(rcDlgClnt); // 獲得對話框客戶區(qū)的大小</p><p> MoveWindow(rcDlgWnd.left, rcDlgWnd.top,(rcDlgWnd.Width
59、()-rcDlgClnt.Width())/2+m_AMovie.GetImageSourceWidth(),</p><p> rcDlgWnd.Height()-rcDlgClnt.Height()+m_AMovie.GetImageSourceHeight()+m_RecInitAMovie.Height());</p><p><b> }</b><
60、/p><p><b> }</b></p><p> 函數(shù)流程如下圖3.3.1-1所示:</p><p> 圖3.3.1-1 void CCTLY2412Dlg::MoveMovieWindow() 的流程圖</p><p> void CCTLY2412Dlg::OnFileOpen()</p>&
61、lt;p> 該函數(shù)為主窗口下的菜單欄“文件|打開”的消息響應(yīng)函數(shù),完成文件的打開操作,包括文件類型過濾,成功打開的文件加載到ActiveMovie控件對象中,窗口恢復(fù)默認大小的操作。</p><p><b> 函數(shù)代碼如下所示:</b></p><p> void CCTLY2412Dlg::OnFileOpen(){</p><p&g
62、t; // TODO: Add your command handler code here</p><p><b> //文件類型過濾</b></p><p> char szFileFilter[]=</p><p> "All File(*.*)|*.*|"</p><p> &quo
63、t;Mp3 File(*.mp3)|*.mp3|"</p><p> "Wma File(*.wma)|*.wma|"</p><p> "Wave File(*.wav)|*.wav|"</p><p> "AVI File(*.avi)|*.avi|"</p><p&
64、gt; "Movie File(*.mov)|*.mov|"</p><p> "Media File(*.mmm)|*.mmm|"</p><p> "Mid File(*.mid;*,rmi)|*.mid;*.rmi|"</p><p> "MPEG File(*.mpeg)|*.mp
65、eg||";</p><p> CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY,szFileFilter);</p><p> if(dlg.DoModal()==IDOK)</p><p><b> {</b></p><p> if("&qu
66、ot; != m_AMovie.GetFileName())</p><p><b> {</b></p><p> m_AMovie.SetCurrentPosition(0);</p><p> KillTimer(0);//關(guān)掉定時器</p><p><b> }</b></p&
67、gt;<p> CString PathName=dlg.GetPathName();</p><p> PathName.MakeUpper();</p><p> m_AMovie.SetFileName(PathName);</p><p> InitMoveWindow(); //打開文件完畢后初始化窗口,等待文件加載結(jié)束</p
68、><p><b> }</b></p><p><b> }</b></p><p> 函數(shù)流程如下圖3.3.1-2所示:</p><p> 圖3.3.1-2 void CCTLY2412Dlg::OnFileOpen() 流程圖</p><p> void CCTLY
69、2412Dlg::OnOpenCompleteAmovie()</p><p> Amovie控件加載媒體文件完畢后響應(yīng)的函數(shù),函數(shù)要重繪窗口(設(shè)置窗口區(qū)的大小、居中等),將Amovie控件的播放區(qū)大小設(shè)置為正常大小。</p><p><b> 函數(shù)代碼如下所示:</b></p><p> void CCTLY2412Dlg::OnOpe
70、nCompleteAmovie(){</p><p> // TODO: Add your control notification handler code here</p><p> MoveMovieWindow(); //重繪制窗口</p><p> CenterWindow(CWnd::GetDesktopWindow()); //將窗口置于屏幕
71、中央</p><p> if("" != m_AMovie.GetFileName())</p><p><b> {</b></p><p> m_AMovie.SetMovieWindowSize(0); // 為了重畫窗口,找其他辦法</p><p><b> }</
72、b></p><p><b> }</b></p><p> void CCTLY2412Dlg::OnFileClose()</p><p> 菜單“文件|關(guān)閉”的消息響應(yīng)函數(shù),當(dāng)播放控件加載的文件為非空時,將進度設(shè)置為0同時關(guān)掉定時器。還要將加載的文件名設(shè)置為””,將主窗口恢復(fù)至默認的顯示狀態(tài)。</p><p
73、><b> 函數(shù)代碼如下所示:</b></p><p> void CCTLY2412Dlg::OnFileClose(){</p><p> if("" != m_AMovie.GetFileName())</p><p><b> {</b></p><p>
74、 m_AMovie.SetCurrentPosition(0);</p><p> KillTimer(0);//關(guān)掉定時器</p><p><b> }</b></p><p> m_AMovie.SetFileName("");</p><p> InitMoveWindow();<
75、/p><p><b> }</b></p><p> void CCTLY2412Dlg::OnFileExit()</p><p> 菜單“文件|退出”的消息響應(yīng)函數(shù),完成程序的退出操作。</p><p><b> 函數(shù)代碼如下所示:</b></p><p> voi
76、d CCTLY2412Dlg::OnFileExit() {</p><p> OnCancel(); </p><p><b> }</b></p><p> void CCTLY2412Dlg::OnPlayStart()</p><p> 菜單“播放|開始”的消息響應(yīng)函數(shù)。若加載文件的文件名為””,則提示為
77、加載任何文件,否則運行播放控件加載的媒體文件,設(shè)置定時器。</p><p><b> 函數(shù)代碼如下所示:</b></p><p> void CCTLY2412Dlg::OnPlayStart(){</p><p> if(""!=m_AMovie.GetFileName()){</p><p>
78、; m_AMovie.Run();</p><p> SetTimer(0,20,NULL);//設(shè)置定時器</p><p><b> }</b></p><p><b> else{</b></p><p> MessageBox("未加載任何文件,請先打開一個媒體文件&quo
79、t;);</p><p><b> }</b></p><p><b> }</b></p><p> 【注】“播放|暫停”菜單與“播放|停止”菜單與上面的“開始”類似,詳見附件中的源代碼。</p><p> void CCTLY2412Dlg::OnVideo1x()</p>
80、<p> 函數(shù)為“視頻|原始大小”的消息響應(yīng)函數(shù),將播放區(qū)的大小設(shè)置為正常播放大小。</p><p> 源代碼請參見附件中的CTLY2412Dlg.cpp ,下面給出函數(shù)的流程圖。</p><p> void CCTLY2412Dlg::OnVideoFullScreen()</p><p> 函數(shù)為“視頻|全屏”的消息響應(yīng)函數(shù),將播放區(qū)的大小設(shè)
81、置為全屏播放。</p><p> 源代碼請參見附件中的CTLY2412Dlg.cpp ,下面給出函數(shù)的流程圖。</p><p> void CCTLY2412Dlg::OnAudeoVolume()</p><p> 函數(shù)為“音頻|聲音調(diào)節(jié)”的消息響應(yīng)函數(shù)。若播放控件為加載媒體文件,則提示為加載媒體文件;否則將生成CCVolumeDlg對象dlg,并將播放控件
82、對象的地址傳入到dlg對象的內(nèi)部去,并生成“聲音調(diào)節(jié)器”窗口。具體情況將在class CCVolumeDlg類中分析。</p><p> 源代碼請參見附件中的CTLY2412Dlg.cpp ,下面給出函數(shù)的流程圖。</p><p> void CCTLY2412Dlg::OnHelpAbout()</p><p> 函數(shù)為“幫助|關(guān)于播放器”的消息響應(yīng)函數(shù)。&
83、lt;/p><p> 源代碼請參見附件中的CTLY2412Dlg.cpp ,下面給出函數(shù)的流程圖。</p><p> void CCTLY2412Dlg::OnClickAmovie()</p><p> 函數(shù)為播放控件的播放區(qū)(有視屏加載時才有一個播放區(qū))在有鼠標(biāo)單擊事件發(fā)生時的消息響應(yīng)函數(shù)。該函數(shù)主要用于在播放狀態(tài)不為全屏?xí)r,單擊鼠標(biāo)能夠進行播放狀態(tài)的“播放”
84、與“暫?!敝g的切換,方便用戶使用播放器。</p><p> 源代碼請參見附件中的CTLY2412Dlg.cpp ,下面給出函數(shù)的流程圖。</p><p> class CCVolumeDlg</p><p> BOOL CCVolumeDlg::OnInitDialog()</p><p> 函數(shù)是創(chuàng)建該類是自動創(chuàng)建的函數(shù),用于實現(xiàn)
85、該類對象在創(chuàng)建時的初始化。</p><p> 函數(shù)的代碼如下所示,函數(shù)的具體實現(xiàn)參看注釋內(nèi)容。</p><p> BOOL CCVolumeDlg::OnInitDialog()</p><p><b> {</b></p><p> CDialog::OnInitDialog();</p><
86、;p> //滑塊1初始化Volume</p><p> m_Volume1.SetRange(-10000,0); //設(shè)置滑塊1的值的變化范圍</p><p> m_Volume1.SetTicFreq(100); //設(shè)置滑塊移動時,值得變化的最小值</p><p> m_Volume1.SetLineSize(100); //設(shè)置鼠標(biāo)在
87、點擊滑塊某端時值得變化的最小值</p><p> m_Volume1.SetPageSize(1000); </p><p> m_Volume1.SetPos(m_pAMovie->GetVolume()); </p><p> //滑塊2初始化Balance</p><p> m_Volume2.SetRange(-100
88、00,10000); //設(shè)置滑塊2的值的變化范圍</p><p> m_Volume2.SetTicFreq(1000);</p><p> m_Volume2.SetLineSize(1000);</p><p> m_Volume2.SetPageSize(2000);</p><p> m_Volume2.SetPos(
89、m_pAMovie->GetBalance());</p><p> //顯示靜態(tài)文本內(nèi)容</p><p> CStringstrText;</p><p> strText.Format("%d",(m_Volume1.GetPos()+10000)/100); //修改靜態(tài)文本框1顯示內(nèi)容Volume</p>&
90、lt;p> SetDlgItemText(IDC_VOLUME_STATIC1,strText);</p><p> strText.Format("%d",m_Volume2.GetPos()/1000); //修改靜態(tài)文本框2顯示內(nèi)容Balance</p><p> SetDlgItemText(IDC_VOLUME_STATIC2,st
91、rText);</p><p> return true;</p><p><b> }</b></p><p> void CCVolumeDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)</p><p> 函數(shù)是在“聲音調(diào)節(jié)器”下,
92、滑塊滾動事件發(fā)生時的響應(yīng)函數(shù),函數(shù)的主要功能是當(dāng)對應(yīng)的事件發(fā)生時,根據(jù)滑塊的當(dāng)前位置修改當(dāng)前滑塊所對應(yīng)的靜態(tài)文本顯示的數(shù)值,同時修改播放控件的音量或左右聲道平衡。</p><p><b> 函數(shù)代碼如下所示。</b></p><p> void CCVolumeDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar*
93、pScrollBar) </p><p><b> {</b></p><p> // TODO: Add your message handler code here and/or call default</p><p> if(pScrollBar->GetDlgCtrlID()==IDC_SLIDER_Volume1)<
94、;/p><p><b> {</b></p><p> CStringstrText;</p><p> strText.Format("%d",(m_Volume1.GetPos()+10000)/100);</p><p> SetDlgItemText(IDC_VOLUME_STATIC1
95、,strText);</p><p> m_pAMovie->SetVolume(m_Volume1.GetPos());</p><p><b> }</b></p><p> else if(pScrollBar->GetDlgCtrlID()==IDC_SLIDER_Volume2)</p><p&g
96、t;<b> {</b></p><p> CString strText;</p><p> strText.Format("%d",m_Volume2.GetPos()/1000);</p><p> SetDlgItemText(IDC_VOLUME_STATIC2,strText);</p>&
97、lt;p> m_pAMovie->SetBalance(m_Volume2.GetPos());</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p><b> }
98、</b></p><p> CDialog::OnHScroll(nSBCode, nPos, pScrollBar);</p><p><b> }</b></p><p> 函數(shù)實現(xiàn)流程如下所示。</p><p><b> 程序運行與測試</b></p><
99、;p><b> 測試方法</b></p><p> 一般來說,程序的測試方法主要有兩種:如果已經(jīng)知道了軟件系統(tǒng)應(yīng)具有的功能,可通過測試每個功能點是否能正常使用來達到測試的目的,這樣的測試方法叫白盒測試;如果知道程序的內(nèi)部工作過程,可以通過測試來檢測程序內(nèi)部是否按照規(guī)格說明書的規(guī)定按照正常流程來運行,這樣的測試方法叫做黑盒測試。</p><p> 本程序采用
100、兩種方法結(jié)合的方式來測試軟件。在程序開發(fā)過程中,主要采用黑盒測試的辦法進行單元測試,主要測試各個單元(如各個函數(shù)、各個基本模塊)是否按照正常的流程來運行。因此這種測試方法的工作量大,而且是不定期進行的,所以這里不便于給出詳細的測試過程,這些過程本身結(jié)合與程序的編寫過程中。</p><p> 在程序開發(fā)完成后期,可以進行系統(tǒng)的白盒測試,這是最簡單也是最有效的辦法,通過就簡單的白盒測試,查看各個功能點是否都能夠?qū)崿F(xiàn)
101、操作,并且查看出哪里有無異常,然后再進行調(diào)試、修改、再調(diào)試、和再運行。</p><p><b> 程序運行和測試結(jié)果</b></p><p> 由于白盒測試可以結(jié)合到程序運行階段來進行分析,因此這里將變運行,邊測試程序的功能點的實現(xiàn)結(jié)果。</p><p><b> 運行程序</b></p><p&
102、gt; 點擊程序圖標(biāo)后即可運行程序,下面圖4.2.1可以看到程序運行的界面。</p><p><b> 圖4.2.1</b></p><p> 這是程序運行的默認界面、初始化界面,也是加載音頻文件的播放界面和關(guān)閉視頻文件后恢復(fù)到的界面。程序主界面運行正常。</p><p> 主界面下各個菜單的彈出情況</p><p&
103、gt; 下面的組圖給出個菜單的彈出界面截圖,菜單都彈出正常。</p><p><b> “文件”菜單</b></p><p><b> “打開”子項</b></p><p> 選擇“文件|打開”彈出“打開”對話框,如下圖4.2.3-1所示。</p><p> 圖4.2.3-1 打開對話框&
104、lt;/p><p> 選擇符合打開格式的媒體文件,這里打開的是視頻文件,然后點擊“打開”。結(jié)果運行如下圖4.2.3-2。</p><p> 圖4.2.3-2 打開視頻文件后的主窗口</p><p> 有上面打開視頻文件后的主窗口可以看到,播放器在加載完媒體文件后自動調(diào)整了播放窗口的大小,以適應(yīng)影片的播放。同時播放的窗口將處于整個屏幕的中心。</p>
105、<p><b> “關(guān)閉”子項</b></p><p> 在當(dāng)前加載了視屏文件的情況下,選擇“文件|關(guān)閉”,窗口又回到了默認的窗口狀態(tài)下(與剛進入軟件的界面一樣),而窗口的左上角與原先未關(guān)閉的情況下相同。</p><p><b> “退出”子項</b></p><p> 不管有無文件加載,選擇“文件|退出
106、”,都退出多媒體播放器。</p><p><b> “播放”菜單</b></p><p> 在未加載媒體文件的情況下,分別點擊菜單“播放”、“視頻”、“音頻”的各個子項,都彈出提示對話框。圖如下圖4.2.4-1所示。</p><p><b> 圖4.2.4-1</b></p><p> 在加
107、載媒體文件的情況下,選擇“播放|開始”,播放器就開始播放媒體文件(這里播放的是視屏文件)。選擇“播放|暫?!?,播放區(qū)就暫停視頻播放,進度條停在當(dāng)前位置。選擇“播放|停止”,播放區(qū)又回到了剛加載視屏文件的視圖下,進度條又重新回到了00:00下面。</p><p> 詳見下面圖4.2.4-1所示。</p><p><b> 圖4.2.4-1</b></p>
108、<p><b> “視頻”菜單</b></p><p><b> “原始大小”子項</b></p><p> 原始大小就是上面播放區(qū)的大小,因為軟件本身設(shè)計的時候就是固定大小的,當(dāng)視頻文件加載的時候,播放區(qū)的視頻文件就是處在正常播放的大小狀態(tài)下,并由由此計算出了主窗口的大小,就是這個“原始大小”,因此這個功能也是正常的。<
109、;/p><p> 當(dāng)我單擊鼠標(biāo)左鍵時,就能進行播放狀態(tài)的控制。當(dāng)當(dāng)前為播放狀態(tài)時,單擊就會變成暫停狀態(tài);當(dāng)當(dāng)前播放狀態(tài)為暫?;蛲V?fàn)顟B(tài)時,單擊鼠標(biāo)左鍵,就會變成播放狀態(tài)。</p><p><b> “全屏”子項</b></p><p> 當(dāng)選擇“視頻|全屏”的時候,播放區(qū)就擴大到整個屏幕,窗口的菜單及下面的播放控制按鈕就不再顯示,單擊鼠標(biāo)左鍵
110、時就回到正常播放狀態(tài)下。</p><p><b> “音頻”菜單</b></p><p> 選擇“音頻|聲音調(diào)節(jié)”,可彈出如下圖4.2.6-1所示的“聲音調(diào)節(jié)器”對話框。</p><p><b> 圖4.2.6-1</b></p><p> 可以用鼠標(biāo)、左右按鍵或鼠標(biāo)滾輪來調(diào)節(jié)“音量大小”或
111、“水平聲道”??梢詫Ρ壬蠄D圖4.2.6-1和下圖圖4.2.6-2兩張圖觀察調(diào)節(jié)滑塊的變化。</p><p><b> 圖4.2.6-2</b></p><p><b> “幫助”菜單</b></p><p> 選擇“幫助|關(guān)于 播放器”,彈出如下圖4.2.7所示的對話框,顯示了該程序的版本和該程序的設(shè)計目的和本人的郵
112、箱地址。點擊確定或右上角的“X”可以關(guān)閉該對話框。</p><p><b> 圖4.2.7</b></p><p><b> 總結(jié)</b></p><p> 在拿到我的這道題目的時候,我的第一感覺是不知道怎么去下手,因為之前一直沒有嘗試過多媒體軟件的開發(fā),所以不知道怎么去著手解決這個多媒體軟件開發(fā)的入口,也感覺到自己
113、在這方面知識的欠缺。因此下定決心決定利用這次課程設(shè)計的機會學(xué)習(xí)一下怎么去開發(fā)多媒體軟件。查閱了有關(guān)資料后我了解到VC已經(jīng)給我們提供了非常便捷的開發(fā)發(fā)放,由VC提供的豐富的控件,我們只要在其設(shè)計良好的框架的基礎(chǔ)上逐漸往里添加我需要的控件,并利用組織合理的代碼將各個控件有效的組織在一起,就能非??焖俚耐瓿梢粋€軟件的開發(fā),這當(dāng)然包括一個多媒體軟件的制作。而本學(xué)期剛好開了VC++這門課程,在扎實的C與C++功底基礎(chǔ)上,我又回過頭補了一下VC課程
114、,回顧了一下怎么利用VC的集成開發(fā)環(huán)境以及微軟基礎(chǔ)類庫MFC來完成一個基于Windows的可視化窗口式軟件的開發(fā)。正是使用到微軟提供的ActiveMovie控件,省去我許多工作,多媒體播放器的媒體文件的解碼工作就由是ActiveMovie完成的。</p><p> 我結(jié)合軟件工程課程的開發(fā)過程,在開發(fā)之初做好了整個多媒體播放器的整體設(shè)計,確定了軟件的框架、主要構(gòu)件以及構(gòu)件之間的關(guān)聯(lián)。而后由總體設(shè)計逐漸深入完成軟
115、件的詳細設(shè)計和開發(fā)過程。</p><p> 完成多媒體播放器之后,我深刻的體會到系統(tǒng)構(gòu)架和設(shè)計模式的重要性。代碼的組織都是非常的重要,這直接關(guān)系到后期的軟件維護。編寫代碼更加有條理,才會更加符合軟件工程的標(biāo)準(zhǔn)。VC這是給我們提供了一個良好的系統(tǒng)構(gòu)架,基于MFC的軟件開發(fā)正式得益這種設(shè)計良好的系統(tǒng)構(gòu)架,可能MFC還有不盡人意之處,但是作為新人,用它作為我們學(xué)習(xí)的工具,那還是非常有的選擇的。而我們的設(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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 多媒體播放器課程設(shè)計
- vc課程設(shè)計--多媒體播放器
- 可視化課程設(shè)計---多媒體播放器系統(tǒng)實現(xiàn)
- 多媒體播放器論文
- 便攜式媒體播放器軟件設(shè)計.pdf
- 項目要求書_媒體播放器
- 06媒體播放器需求分析
- 多媒體播放器的設(shè)計與開發(fā).pdf
- 多媒體播放器(PMP)實現(xiàn).pdf
- SoPC平臺媒體播放器的軟件架構(gòu)設(shè)計與優(yōu)化.pdf
- 利用vb實現(xiàn)多媒體播放器
- 自制媒體播放器的設(shè)計研究【開題報告】
- 媒體播放器的設(shè)計與實現(xiàn)畢業(yè)設(shè)計
- 用java構(gòu)造自己的媒體播放器
- 多媒體播放器系統(tǒng)的設(shè)計與實現(xiàn)
- 颶風(fēng)影音多媒體播放器(代碼部分)
- 便攜式多媒體播放器硬件設(shè)計.pdf
- IPTV流媒體播放器的設(shè)計與實現(xiàn).pdf
- 流媒體播放器構(gòu)件的設(shè)計與實現(xiàn).pdf
- 便攜式多媒體播放器軟件平臺的設(shè)計與實現(xiàn).pdf
評論
0/150
提交評論