軟件工程課程設(shè)計---媒體播放器_第1頁
已閱讀1頁,還剩21頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論