版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 軟件工程課程設(shè)計(jì)</b></p><p> 題 目 多媒體播放器</p><p><b> 目 錄</b></p><p> 0 任務(wù)書(shū) ………………………………………………… </p><p> 1 需求分析 …………………………………………
2、…… 1</p><p> 2 總體設(shè)計(jì) ……………………………………………… 1</p><p> 2.1 ActiveMovie控件概述 ……………………………… 1</p><p> 2.2軟件的總體架構(gòu) ……………………………………… 2</p><p> 2.3開(kāi)發(fā)工具 ……………………………………………… 2
3、</p><p> 3 詳細(xì)設(shè)計(jì) ……………………………………………… 3</p><p> 3.1類(lèi)的說(shuō)明 ……………………………………………… 3</p><p> 3.2全局變量 ……………………………………………… 6</p><p> 3.3主要函數(shù)說(shuō)明及其函數(shù)流程圖 ……………………… 6</p>
4、<p> 4 程序運(yùn)行與測(cè)試 ……………………………………… 13</p><p> 4.1測(cè)試方法 ……………………………………………… 13</p><p> 4.2程序運(yùn)行和測(cè)試結(jié)果 ………………………………… 14</p><p> 5 總結(jié) …………………………………………………… 18</p><p> 《
5、軟件工程》課程設(shè)計(jì)</p><p><b> 任 務(wù) 書(shū)</b></p><p> 多媒體播放器程序的設(shè)計(jì)與實(shí)現(xiàn)</p><p> 目的:利用VC++開(kāi)發(fā)一個(gè)支持mp3、wma、wmv、avi、mpg等不同音頻、視頻格式的多媒體播放器。通過(guò)課程設(shè)計(jì)掌握多媒體編程的基本原理。</p><p><b>
6、 任務(wù):</b></p><p> 編程實(shí)現(xiàn)一個(gè)可支持多種音視頻格式的多媒體播放器,其基本功能包括媒體播放、音量調(diào)節(jié)、播放進(jìn)度選擇、暫停、停止以及歌曲信息的查詢(xún)與添加等。</p><p> 給出程序的總體設(shè)計(jì)和詳細(xì)設(shè)計(jì),要求程序總體架構(gòu)圖、詳細(xì)設(shè)計(jì)的流程圖,函數(shù)、變量說(shuō)明等。</p><p> 給出程序運(yùn)行、測(cè)試的詳細(xì)結(jié)果。</p>
7、<p><b> 多媒體播放器</b></p><p><b> 需求分析</b></p><p> 現(xiàn)代電子科學(xué)計(jì)算機(jī)的發(fā)展給社會(huì)帶來(lái)很大的變化,人們的生活發(fā)生了很大的變化。家用型電子計(jì)算機(jī)幾乎進(jìn)了每家每戶(hù),滿足了人們生活的各種需要,而這更歸功與各種各樣的計(jì)算機(jī)軟件的出現(xiàn)。多媒體播放器也是其中非常重要的一員。</p>
8、<p> 多媒體是一種新型的信息處理與傳播技術(shù)。它的出現(xiàn)曾經(jīng)經(jīng)歷過(guò)巨大的坎坷,但是卻不影響它給整個(gè)社會(huì)帶來(lái)深遠(yuǎn)的影響,有人還認(rèn)為它是信息及其傳輸媒介方面的一場(chǎng)根本革命。自從多媒體技術(shù)廣泛推廣后,人們?cè)诰W(wǎng)上瀏覽網(wǎng)頁(yè)時(shí)有了豐富多彩的音樂(lè)、影片,在家也能觀看電影、電視劇等等。人們也對(duì)新的技術(shù)有了更多的渴望、歡迎、認(rèn)識(shí)和遠(yuǎn)見(jiàn),計(jì)算機(jī)多媒體技術(shù)的功能在商業(yè)、文化娛樂(lè)和教育等方面的應(yīng)用效果明顯,前景廣闊。然而多媒體播放器的開(kāi)發(fā)仍然不
9、能滿足人們的需求,多媒體文件格式多樣,但卻沒(méi)有一款播放器能滿足多有格式的解碼。人們渴望解碼能力更強(qiáng)大,功能更加完備的多媒體播放器。</p><p> 本文采用VC++6.0作為開(kāi)發(fā)工具,設(shè)計(jì)并實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的多媒體播放器,支持mp3、wma、wmv、avi、mpg、rmvb等主流音頻和視頻格式的媒體文件的播放。同時(shí),本多媒體播放器實(shí)現(xiàn)了媒體文件的打開(kāi)、關(guān)閉、播放、暫停、停止、音量、左右聲道、播放進(jìn)度的顯示和控制
10、等功能,基本實(shí)現(xiàn)了軟件工程課程設(shè)計(jì)的功能點(diǎn)要求。</p><p><b> 總體設(shè)計(jì)</b></p><p> ActiveMovie控件概述</p><p> ActiveMovie控件是微軟公司推出的用于多媒體程序設(shè)計(jì)的可視動(dòng)畫(huà)ActiveX控件,由于該控件內(nèi)嵌了Microsoft MPEG音頻解碼器和Microsoft MPEG視頻
11、解碼器,能支持多種文件格式,從最常見(jiàn)的WAV文件和AVI文件到使用MPEG壓縮格式的VCD視頻文件,都可以正常的進(jìn)行播放??丶芨鶕?jù)文件后綴進(jìn)行自動(dòng)判別設(shè)備類(lèi)型,并完成相應(yīng)的控制。因此,若正在編寫(xiě)的應(yīng)用程序需要提供多媒體支持,那么使用ActiveMovie控件是一個(gè)很好的主意。事實(shí)上,很多優(yōu)秀的多媒體應(yīng)用程序,其內(nèi)部的多媒體回放就是利用ActiveMovie控件來(lái)實(shí)現(xiàn)。只要精心地設(shè)計(jì)應(yīng)用程序的用戶(hù)界面,我們一樣可以開(kāi)發(fā)出功能齊全、外觀漂
12、亮、具有相當(dāng)水準(zhǔn)的多媒體播放器。而且,在Windows 95/98和Windows NT的最新版本中,ActiveMovie控件已作為操作系統(tǒng)的一部分來(lái)提供,即使用戶(hù)系統(tǒng)中沒(méi)有安裝ActiveMovie控件,Microsoft的許可協(xié)議也允許在你的應(yīng)用程序的發(fā)行包中發(fā)布ActiveMovie的運(yùn)行時(shí)文件。</p><p> 可視動(dòng)畫(huà)控件ActiveMovie Control Object為程序員提供了在該層次上
13、控制媒體設(shè)備接口的能力,它包含一組高層次的獨(dú)立于設(shè)備的命令,可以控制音頻和視頻外設(shè),我們不必關(guān)心具體的設(shè)備便可以對(duì)CD、視盤(pán)機(jī)、波形音頻設(shè)備、視頻播放設(shè)備和MIDI設(shè)備等媒體設(shè)備進(jìn)行控制,也可以理解成設(shè)備面板上的一排按鍵,通過(guò)選擇不同的按鍵(發(fā)送不同的命令)即可讓設(shè)備完成各種功能,而不必關(guān)心設(shè)備的內(nèi)部實(shí)現(xiàn)。因此,程序員本身可以不用關(guān)心控件是怎么完成多媒體文件的解碼、怎么將解碼后的視頻信息呈現(xiàn)在播放區(qū)上、怎么將解碼后的聲音信息呈現(xiàn)在揚(yáng)聲器
14、上等等,而僅僅需要調(diào)用相應(yīng)已經(jīng)封裝好的函數(shù)(或接口),來(lái)完成文件的加載控制、媒體文件的解碼控制、媒體文件的播放控制、媒體文件的播放區(qū)控制、媒體文件的聲音控制、程序的差錯(cuò)控制等等。本多媒體播放器正是基于ActiveMovie控件的基礎(chǔ)進(jìn)行了軟件本身的開(kāi)發(fā),借助與ActiveMovie本身強(qiáng)大的解碼功能,并通過(guò)控件對(duì)外提供的良好接口來(lái)實(shí)現(xiàn)多媒體文件的播放和控制。</p><p><b> 軟件的總體架構(gòu)&
15、lt;/b></p><p> 控件是現(xiàn)代軟件開(kāi)發(fā)過(guò)程中必不可少的軟件要素,自然有效的使用現(xiàn)成的控件不但可以縮短開(kāi)發(fā)周期,也極大的降低了軟件開(kāi)發(fā)人員的工作量。本多媒體播放正是基于ActiveMovie Control Object控件實(shí)現(xiàn)的,當(dāng)然也包含其他控件(例如菜單、滑塊、按鈕等等),但是前者是整個(gè)播放器的核心控件,由該控件完成了由其他控件加載的多媒體文件的解碼,以及完成由其他控件提交的控制信息的響應(yīng)
16、。所以軟件本身實(shí)現(xiàn)了對(duì)多個(gè)控件的功能的有效整合,通過(guò)這樣的方式來(lái)完成整個(gè)多媒體播放器的功能。</p><p> 軟件的總體架構(gòu)參看下面圖2.2。</p><p><b> 圖2.2</b></p><p><b> 開(kāi)發(fā)工具</b></p><p> Visual C++6.0是微軟公司推出
17、的開(kāi)發(fā)Win32應(yīng)用程序(Windows 95/98/2000/XP/NT)的、面向?qū)ο蟮目梢暬晒ぞ摺K淖畲髢?yōu)點(diǎn)就是提供了功能強(qiáng)大的MFC類(lèi)庫(kù),MFC是一個(gè)很大的C++類(lèi)層次結(jié)構(gòu),其中封裝了大量的類(lèi)及其函數(shù),很多Windows程序所共有的標(biāo)準(zhǔn)內(nèi)容可以由MFC的類(lèi)來(lái)提供,MFC類(lèi)為這些內(nèi)容提供了用戶(hù)接口的標(biāo)準(zhǔn)實(shí)現(xiàn)方法,程序員所要做的就是通過(guò)預(yù)定義的接口把具體應(yīng)用程序特有的東西填入這個(gè)輪廓,這將簡(jiǎn)化編程工作,大大的減少程序員編寫(xiě)的代碼
18、數(shù)量,使編程工作變得更加輕松容易。</p><p> 本程序正是在VC++6.0集成開(kāi)發(fā)環(huán)境下開(kāi)發(fā),使用了功能強(qiáng)大的MFC類(lèi)庫(kù),以及借助了及其方便的可視化開(kāi)發(fā)方法。</p><p><b> 詳細(xì)設(shè)計(jì)</b></p><p><b> 類(lèi)的說(shuō)明</b></p><p> 在按照工作向?qū)?,完?/p>
19、一個(gè)MFC軟件工程的建立之后,VC就自動(dòng)為我們創(chuàng)建了三個(gè)基本的類(lèi)。程序中為了完成對(duì)音量的大小和左右聲道平衡的控制,我又專(zhuān)門(mén)為此添加了一個(gè)類(lèi),并指向音量控制窗口。下面對(duì)程序中用到的類(lèi)概要說(shuō)明。</p><p> class CCTLY2412App : public CwinApp</p><p> 該類(lèi)由工程向?qū)ё詣?dòng)創(chuàng)建,用于維護(hù)整個(gè)進(jìn)程,以及完成對(duì)進(jìn)程的控制,在類(lèi)當(dāng)中包含一個(gè)構(gòu)造函數(shù)
20、CCTLY2412App()(用于創(chuàng)建一個(gè)實(shí)例)和一個(gè)由父類(lèi)繼承的虛函數(shù)virtual BOOL InitInstance()(用于初始化一個(gè)實(shí)例)。播放器的主要功能實(shí)現(xiàn)并不是在該類(lèi)下,因此并未對(duì)該類(lèi)下的屬性和方法進(jìn)行修改,它仍然保持默認(rèn)的形式。</p><p> class CAboutDlg : public Cdialog</p><p> 程序的幫助窗口,用于顯示程序的幫助信息
21、,本程序中用于顯示有關(guān)程序的信息,主要是對(duì)幫助窗口的顯示界面進(jìn)行了修改,類(lèi)的主體仍然是保持默認(rèn)的形式。</p><p> class CCTLY2412Dlg : public Cdialog</p><p> 該類(lèi)是整個(gè)程序的重點(diǎn),維護(hù)著主窗口下面的所有變量和函數(shù)、以及與主窗口有關(guān)的消息和消息響應(yīng)函數(shù)。</p><p><b> 該類(lèi)的聲明如下:&
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; //保存文件未被加載時(shí),控件的初始大小</p><p> CRectm_RecAMovie; //正在運(yùn)行的控件的初始大小,用于播放區(qū)大小調(diào)整時(shí)使用</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èi)下有三個(gè)成員變量,如下所示。&l
35、t;/p><p> CactiveMoviem_Amovie :</p><p> 該成員變量用于維持主窗口中的由ActiveMovie 控件實(shí)例化產(chǎn)生的對(duì)象,在主窗口運(yùn)行期間,用戶(hù)打開(kāi)的文件的加載到ActiveMovie 控件、已加載了文件的ActiveMovie (控件)的播放、暫停、停止、音量控制等等都需要通過(guò)該對(duì)象的成員函數(shù)來(lái)完成。因此該對(duì)象非常重要。在函數(shù)說(shuō)明中還將繼續(xù)對(duì)該對(duì)象
36、的成員函數(shù)進(jìn)行說(shuō)明。</p><p> CRect m_RecInitAMovie :</p><p> 在主窗口創(chuàng)建后,主窗口的用戶(hù)區(qū)還會(huì)嵌入ActiveMovie 控件的播放區(qū),這個(gè)還未加載播放文件的播放區(qū)對(duì)窗口的調(diào)整非常重要,因此專(zhuān)門(mén)用此變量存放ActiveMovie 控件播放區(qū)的矩形區(qū)域。為加載視頻文件后的窗口調(diào)整和關(guān)閉視頻文件后的窗口恢復(fù)到默認(rèn)狀態(tài)下提供參考數(shù)據(jù)。這里
37、說(shuō)明一下,播放器只有在加載視頻文件后,才會(huì)對(duì)播放區(qū)進(jìn)行相應(yīng)的調(diào)整,以使窗口的大小能夠適應(yīng)播放區(qū)的大小,在再打開(kāi)視頻文件后會(huì)重新對(duì)窗口大小進(jìn)行調(diào)整,在關(guān)閉視頻文件后,窗口會(huì)恢復(fù)到默認(rèn)的窗口大小,而音頻文件的播放正是在默認(rèn)窗口大小下。而m_RecInitAMovie中的數(shù)據(jù)正是恢復(fù)初始化窗口大小所需要的。</p><p> CRect m_RecAMovie :</p><p>
38、播放器設(shè)置了調(diào)整播放區(qū)的功能,而由于ActiveMovie控件的特性,在我們對(duì)播放區(qū)進(jìn)行調(diào)整的時(shí)候后必須保存原始播放區(qū)的大小,因此需要在設(shè)置一個(gè)這樣的成員變量。</p><p> class CCVolumeDlg : public Cdialog</p><p> 該類(lèi)是后面添加的。播放器設(shè)計(jì)的時(shí)候?qū)⒙曇暨M(jìn)行單獨(dú)的控制,聲音的調(diào)節(jié)通過(guò)彈出的“聲音調(diào)節(jié)器”來(lái)完成。因此該類(lèi)的設(shè)計(jì)就是為了
39、維護(hù)“聲音交接器”,來(lái)完成聲音音量的調(diào)節(jié),聲音左右聲道的調(diào)節(jié),以及音量大小和左右聲道值的實(shí)時(shí)顯示等。</p><p><b> 該類(lèi)的聲明如下:</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實(shí)例對(duì)象的地址</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> 類(lèi)中有三個(gè)添加的成員變量,如下所示。</p><p> CActiveMovie*m_pAMovie :</p><p
47、> 要完成對(duì)聲音的控制,就要完成對(duì)主窗口中ActiveMovie控件進(jìn)行控制,我們需要調(diào)用ActiveMovie對(duì)象的成員函數(shù),因此在創(chuàng)建CCVolumeDlg實(shí)例對(duì)象的時(shí)候,需要從主窗口中傳入ActiveMovie控件的實(shí)例對(duì)象到CactiveMovie實(shí)例對(duì)象中,而m_pAMovie指針就指向這個(gè)調(diào)節(jié)音量、得到音量需要用的到的ActiveMovie控件的實(shí)例對(duì)象地址。</p><p><b>
48、; 全局變量</b></p><p> CCTLY2412App theApp</p><p> 播放器有一個(gè)默認(rèn)的全局變量CCTLY2412App theApp ,用于維持程序?qū)嵗蟮倪M(jìn)程對(duì)象,但是程序中添加的類(lèi)和函數(shù)都未對(duì)該成員變量進(jìn)行任何的操作,因此這里不進(jìn)行詳細(xì)的說(shuō)明。</p><p> 主要函數(shù)說(shuō)明及其函數(shù)流程圖</p>
49、<p> class CaboutDlg成員函數(shù)</p><p> BOOL CCTLY2412Dlg::OnInitDialog()</p><p> 該函數(shù)是類(lèi)在初始化時(shí)必須要調(diào)用的函數(shù),主要完成一些初始化工作,主要流程都是類(lèi)在添加的時(shí)候自動(dòng)填入的。但是這里需要補(bǔ)充的是,在該函數(shù)中添加了一些自定義的初始化操作。如下面所示,操作說(shuō)明在注釋中已經(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> // 文件未被加載時(shí),窗口的大小</p><p> InitMoveWindow(); //主窗口初始化</p><p> CenterWindow(CWnd::GetDesktopWindow()); //將窗口置于屏幕中央</p>
52、<p> /////////////////////**************/////////////////////</p><p> void CCTLY2412Dlg::InitMoveWindow()</p><p> 完成主窗口的初始化工作,在初始化中將主窗口顯示設(shè)置成默認(rèn)的顯示狀態(tài),或者將主窗口恢復(fù)到默認(rèn)的顯示狀態(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)用戶(hù)加載了媒體文件后,需要對(duì)用戶(hù)區(qū)窗口進(jìn)行調(diào)整,若為音頻文件則恢復(fù)到默認(rèn)顯示狀態(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); // 獲得對(duì)話框的大小</p><p> GetClientRect(rcDlgClnt); // 獲得對(duì)話框客戶(hù)區(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ù)為主窗口下的菜單欄“文件|打開(kāi)”的消息響應(yīng)函數(shù),完成文件的打開(kāi)操作,包括文件類(lèi)型過(guò)濾,成功打開(kāi)的文件加載到ActiveMovie控件對(duì)象中,窗口恢復(fù)默認(rèn)大小的操作。</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> //文件類(lèi)型過(guò)濾</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)掉定時(shí)器</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(); //打開(kāi)文件完畢后初始化窗口,等待文件加載結(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); // 為了重畫(huà)窗口,找其他辦法</p><p><b> }</
72、b></p><p><b> }</b></p><p> void CCTLY2412Dlg::OnFileClose()</p><p> 菜單“文件|關(guān)閉”的消息響應(yīng)函數(shù),當(dāng)播放控件加載的文件為非空時(shí),將進(jìn)度設(shè)置為0同時(shí)關(guān)掉定時(shí)器。還要將加載的文件名設(shè)置為””,將主窗口恢復(fù)至默認(rèn)的顯示狀態(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)掉定時(shí)器</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> 菜單“播放|開(kāi)始”的消息響應(yīng)函數(shù)。若加載文件的文件名為””,則提示為
77、加載任何文件,否則運(yùn)行播放控件加載的媒體文件,設(shè)置定時(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è)置定時(shí)器</p><p><b> }</b></p><p><b> else{</b></p><p> MessageBox("未加載任何文件,請(qǐng)先打開(kāi)一個(gè)媒體文件&quo
79、t;);</p><p><b> }</b></p><p><b> }</b></p><p> 【注】“播放|暫停”菜單與“播放|停止”菜單與上面的“開(kāi)始”類(lèi)似,詳見(jiàn)附件中的源代碼。</p><p> void CCTLY2412Dlg::OnVideo1x()</p>
80、<p> 函數(shù)為“視頻|原始大小”的消息響應(yīng)函數(shù),將播放區(qū)的大小設(shè)置為正常播放大小。</p><p> 源代碼請(qǐng)參見(jiàn)附件中的CTLY2412Dlg.cpp ,下面給出函數(shù)的流程圖。</p><p> void CCTLY2412Dlg::OnVideoFullScreen()</p><p> 函數(shù)為“視頻|全屏”的消息響應(yīng)函數(shù),將播放區(qū)的大小設(shè)
81、置為全屏播放。</p><p> 源代碼請(qǐng)參見(jiàn)附件中的CTLY2412Dlg.cpp ,下面給出函數(shù)的流程圖。</p><p> void CCTLY2412Dlg::OnAudeoVolume()</p><p> 函數(shù)為“音頻|聲音調(diào)節(jié)”的消息響應(yīng)函數(shù)。若播放控件為加載媒體文件,則提示為加載媒體文件;否則將生成CCVolumeDlg對(duì)象dlg,并將播放控件
82、對(duì)象的地址傳入到dlg對(duì)象的內(nèi)部去,并生成“聲音調(diào)節(jié)器”窗口。具體情況將在class CCVolumeDlg類(lèi)中分析。</p><p> 源代碼請(qǐng)參見(jiàn)附件中的CTLY2412Dlg.cpp ,下面給出函數(shù)的流程圖。</p><p> void CCTLY2412Dlg::OnHelpAbout()</p><p> 函數(shù)為“幫助|關(guān)于播放器”的消息響應(yīng)函數(shù)。&
83、lt;/p><p> 源代碼請(qǐng)參見(jiàn)附件中的CTLY2412Dlg.cpp ,下面給出函數(shù)的流程圖。</p><p> void CCTLY2412Dlg::OnClickAmovie()</p><p> 函數(shù)為播放控件的播放區(qū)(有視屏加載時(shí)才有一個(gè)播放區(qū))在有鼠標(biāo)單擊事件發(fā)生時(shí)的消息響應(yīng)函數(shù)。該函數(shù)主要用于在播放狀態(tài)不為全屏?xí)r,單擊鼠標(biāo)能夠進(jìn)行播放狀態(tài)的“播放”
84、與“暫?!敝g的切換,方便用戶(hù)使用播放器。</p><p> 源代碼請(qǐng)參見(jiàn)附件中的CTLY2412Dlg.cpp ,下面給出函數(shù)的流程圖。</p><p> class CCVolumeDlg</p><p> BOOL CCVolumeDlg::OnInitDialog()</p><p> 函數(shù)是創(chuàng)建該類(lèi)是自動(dòng)創(chuàng)建的函數(shù),用于實(shí)現(xiàn)
85、該類(lèi)對(duì)象在創(chuàng)建時(shí)的初始化。</p><p> 函數(shù)的代碼如下所示,函數(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è)置滑塊移動(dòng)時(shí),值得變化的最小值</p><p> m_Volume1.SetLineSize(100); //設(shè)置鼠標(biāo)在
87、點(diǎn)擊滑塊某端時(shí)值得變化的最小值</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、滑塊滾動(dòng)事件發(fā)生時(shí)的響應(yīng)函數(shù),函數(shù)的主要功能是當(dāng)對(duì)應(yīng)的事件發(fā)生時(shí),根據(jù)滑塊的當(dāng)前位置修改當(dāng)前滑塊所對(duì)應(yīng)的靜態(tài)文本顯示的數(shù)值,同時(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ù)實(shí)現(xiàn)流程如下所示。</p><p><b> 程序運(yùn)行與測(cè)試</b></p><
99、;p><b> 測(cè)試方法</b></p><p> 一般來(lái)說(shuō),程序的測(cè)試方法主要有兩種:如果已經(jīng)知道了軟件系統(tǒng)應(yīng)具有的功能,可通過(guò)測(cè)試每個(gè)功能點(diǎn)是否能正常使用來(lái)達(dá)到測(cè)試的目的,這樣的測(cè)試方法叫白盒測(cè)試;如果知道程序的內(nèi)部工作過(guò)程,可以通過(guò)測(cè)試來(lái)檢測(cè)程序內(nèi)部是否按照規(guī)格說(shuō)明書(shū)的規(guī)定按照正常流程來(lái)運(yùn)行,這樣的測(cè)試方法叫做黑盒測(cè)試。</p><p> 本程序采用
100、兩種方法結(jié)合的方式來(lái)測(cè)試軟件。在程序開(kāi)發(fā)過(guò)程中,主要采用黑盒測(cè)試的辦法進(jìn)行單元測(cè)試,主要測(cè)試各個(gè)單元(如各個(gè)函數(shù)、各個(gè)基本模塊)是否按照正常的流程來(lái)運(yùn)行。因此這種測(cè)試方法的工作量大,而且是不定期進(jìn)行的,所以這里不便于給出詳細(xì)的測(cè)試過(guò)程,這些過(guò)程本身結(jié)合與程序的編寫(xiě)過(guò)程中。</p><p> 在程序開(kāi)發(fā)完成后期,可以進(jìn)行系統(tǒng)的白盒測(cè)試,這是最簡(jiǎn)單也是最有效的辦法,通過(guò)就簡(jiǎn)單的白盒測(cè)試,查看各個(gè)功能點(diǎn)是否都能夠?qū)崿F(xiàn)
101、操作,并且查看出哪里有無(wú)異常,然后再進(jìn)行調(diào)試、修改、再調(diào)試、和再運(yùn)行。</p><p><b> 程序運(yùn)行和測(cè)試結(jié)果</b></p><p> 由于白盒測(cè)試可以結(jié)合到程序運(yùn)行階段來(lái)進(jìn)行分析,因此這里將變運(yùn)行,邊測(cè)試程序的功能點(diǎn)的實(shí)現(xiàn)結(jié)果。</p><p><b> 運(yùn)行程序</b></p><p&
102、gt; 點(diǎn)擊程序圖標(biāo)后即可運(yùn)行程序,下面圖4.2.1可以看到程序運(yùn)行的界面。</p><p><b> 圖4.2.1</b></p><p> 這是程序運(yùn)行的默認(rèn)界面、初始化界面,也是加載音頻文件的播放界面和關(guān)閉視頻文件后恢復(fù)到的界面。程序主界面運(yùn)行正常。</p><p> 主界面下各個(gè)菜單的彈出情況</p><p&
103、gt; 下面的組圖給出個(gè)菜單的彈出界面截圖,菜單都彈出正常。</p><p><b> “文件”菜單</b></p><p><b> “打開(kāi)”子項(xiàng)</b></p><p> 選擇“文件|打開(kāi)”彈出“打開(kāi)”對(duì)話框,如下圖4.2.3-1所示。</p><p> 圖4.2.3-1 打開(kāi)對(duì)話框&
104、lt;/p><p> 選擇符合打開(kāi)格式的媒體文件,這里打開(kāi)的是視頻文件,然后點(diǎn)擊“打開(kāi)”。結(jié)果運(yùn)行如下圖4.2.3-2。</p><p> 圖4.2.3-2 打開(kāi)視頻文件后的主窗口</p><p> 有上面打開(kāi)視頻文件后的主窗口可以看到,播放器在加載完媒體文件后自動(dòng)調(diào)整了播放窗口的大小,以適應(yīng)影片的播放。同時(shí)播放的窗口將處于整個(gè)屏幕的中心。</p>
105、<p><b> “關(guān)閉”子項(xiàng)</b></p><p> 在當(dāng)前加載了視屏文件的情況下,選擇“文件|關(guān)閉”,窗口又回到了默認(rèn)的窗口狀態(tài)下(與剛進(jìn)入軟件的界面一樣),而窗口的左上角與原先未關(guān)閉的情況下相同。</p><p><b> “退出”子項(xiàng)</b></p><p> 不管有無(wú)文件加載,選擇“文件|退出
106、”,都退出多媒體播放器。</p><p><b> “播放”菜單</b></p><p> 在未加載媒體文件的情況下,分別點(diǎn)擊菜單“播放”、“視頻”、“音頻”的各個(gè)子項(xiàng),都彈出提示對(duì)話框。圖如下圖4.2.4-1所示。</p><p><b> 圖4.2.4-1</b></p><p> 在加
107、載媒體文件的情況下,選擇“播放|開(kāi)始”,播放器就開(kāi)始播放媒體文件(這里播放的是視屏文件)。選擇“播放|暫?!保シ艆^(qū)就暫停視頻播放,進(jìn)度條停在當(dāng)前位置。選擇“播放|停止”,播放區(qū)又回到了剛加載視屏文件的視圖下,進(jìn)度條又重新回到了00:00下面。</p><p> 詳見(jiàn)下面圖4.2.4-1所示。</p><p><b> 圖4.2.4-1</b></p>
108、<p><b> “視頻”菜單</b></p><p><b> “原始大小”子項(xiàng)</b></p><p> 原始大小就是上面播放區(qū)的大小,因?yàn)檐浖旧碓O(shè)計(jì)的時(shí)候就是固定大小的,當(dāng)視頻文件加載的時(shí)候,播放區(qū)的視頻文件就是處在正常播放的大小狀態(tài)下,并由由此計(jì)算出了主窗口的大小,就是這個(gè)“原始大小”,因此這個(gè)功能也是正常的。<
109、;/p><p> 當(dāng)我單擊鼠標(biāo)左鍵時(shí),就能進(jìn)行播放狀態(tài)的控制。當(dāng)當(dāng)前為播放狀態(tài)時(shí),單擊就會(huì)變成暫停狀態(tài);當(dāng)當(dāng)前播放狀態(tài)為暫停或停止?fàn)顟B(tài)時(shí),單擊鼠標(biāo)左鍵,就會(huì)變成播放狀態(tài)。</p><p><b> “全屏”子項(xiàng)</b></p><p> 當(dāng)選擇“視頻|全屏”的時(shí)候,播放區(qū)就擴(kuò)大到整個(gè)屏幕,窗口的菜單及下面的播放控制按鈕就不再顯示,單擊鼠標(biāo)左鍵
110、時(shí)就回到正常播放狀態(tài)下。</p><p><b> “音頻”菜單</b></p><p> 選擇“音頻|聲音調(diào)節(jié)”,可彈出如下圖4.2.6-1所示的“聲音調(diào)節(jié)器”對(duì)話框。</p><p><b> 圖4.2.6-1</b></p><p> 可以用鼠標(biāo)、左右按鍵或鼠標(biāo)滾輪來(lái)調(diào)節(jié)“音量大小”或
111、“水平聲道”??梢詫?duì)比上圖圖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所示的對(duì)話框,顯示了該程序的版本和該程序的設(shè)計(jì)目的和本人的郵
112、箱地址。點(diǎn)擊確定或右上角的“X”可以關(guān)閉該對(duì)話框。</p><p><b> 圖4.2.7</b></p><p><b> 總結(jié)</b></p><p> 在拿到我的這道題目的時(shí)候,我的第一感覺(jué)是不知道怎么去下手,因?yàn)橹耙恢睕](méi)有嘗試過(guò)多媒體軟件的開(kāi)發(fā),所以不知道怎么去著手解決這個(gè)多媒體軟件開(kāi)發(fā)的入口,也感覺(jué)到自己
113、在這方面知識(shí)的欠缺。因此下定決心決定利用這次課程設(shè)計(jì)的機(jī)會(huì)學(xué)習(xí)一下怎么去開(kāi)發(fā)多媒體軟件。查閱了有關(guān)資料后我了解到VC已經(jīng)給我們提供了非常便捷的開(kāi)發(fā)發(fā)放,由VC提供的豐富的控件,我們只要在其設(shè)計(jì)良好的框架的基礎(chǔ)上逐漸往里添加我需要的控件,并利用組織合理的代碼將各個(gè)控件有效的組織在一起,就能非??焖俚耐瓿梢粋€(gè)軟件的開(kāi)發(fā),這當(dāng)然包括一個(gè)多媒體軟件的制作。而本學(xué)期剛好開(kāi)了VC++這門(mén)課程,在扎實(shí)的C與C++功底基礎(chǔ)上,我又回過(guò)頭補(bǔ)了一下VC課程
114、,回顧了一下怎么利用VC的集成開(kāi)發(fā)環(huán)境以及微軟基礎(chǔ)類(lèi)庫(kù)MFC來(lái)完成一個(gè)基于Windows的可視化窗口式軟件的開(kāi)發(fā)。正是使用到微軟提供的ActiveMovie控件,省去我許多工作,多媒體播放器的媒體文件的解碼工作就由是ActiveMovie完成的。</p><p> 我結(jié)合軟件工程課程的開(kāi)發(fā)過(guò)程,在開(kāi)發(fā)之初做好了整個(gè)多媒體播放器的整體設(shè)計(jì),確定了軟件的框架、主要構(gòu)件以及構(gòu)件之間的關(guān)聯(lián)。而后由總體設(shè)計(jì)逐漸深入完成軟
115、件的詳細(xì)設(shè)計(jì)和開(kāi)發(fā)過(guò)程。</p><p> 完成多媒體播放器之后,我深刻的體會(huì)到系統(tǒng)構(gòu)架和設(shè)計(jì)模式的重要性。代碼的組織都是非常的重要,這直接關(guān)系到后期的軟件維護(hù)。編寫(xiě)代碼更加有條理,才會(huì)更加符合軟件工程的標(biāo)準(zhǔn)。VC這是給我們提供了一個(gè)良好的系統(tǒng)構(gòu)架,基于MFC的軟件開(kāi)發(fā)正式得益這種設(shè)計(jì)良好的系統(tǒng)構(gòu)架,可能MFC還有不盡人意之處,但是作為新人,用它作為我們學(xué)習(xí)的工具,那還是非常有的選擇的。而我們的設(shè)計(jì)模式也是基于
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 多媒體播放器課程設(shè)計(jì)
- vc課程設(shè)計(jì)--多媒體播放器
- 可視化課程設(shè)計(jì)---多媒體播放器系統(tǒng)實(shí)現(xiàn)
- 多媒體播放器論文
- 便攜式媒體播放器軟件設(shè)計(jì).pdf
- 項(xiàng)目要求書(shū)_媒體播放器
- 06媒體播放器需求分析
- 多媒體播放器的設(shè)計(jì)與開(kāi)發(fā).pdf
- 多媒體播放器(PMP)實(shí)現(xiàn).pdf
- SoPC平臺(tái)媒體播放器的軟件架構(gòu)設(shè)計(jì)與優(yōu)化.pdf
- 利用vb實(shí)現(xiàn)多媒體播放器
- 自制媒體播放器的設(shè)計(jì)研究【開(kāi)題報(bào)告】
- 媒體播放器的設(shè)計(jì)與實(shí)現(xiàn)畢業(yè)設(shè)計(jì)
- 用java構(gòu)造自己的媒體播放器
- 多媒體播放器系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)
- 颶風(fēng)影音多媒體播放器(代碼部分)
- 便攜式多媒體播放器硬件設(shè)計(jì).pdf
- IPTV流媒體播放器的設(shè)計(jì)與實(shí)現(xiàn).pdf
- 流媒體播放器構(gòu)件的設(shè)計(jì)與實(shí)現(xiàn).pdf
- 便攜式多媒體播放器軟件平臺(tái)的設(shè)計(jì)與實(shí)現(xiàn).pdf
評(píng)論
0/150
提交評(píng)論