MFC課程設(shè)計(jì)報(bào)告_第1頁(yè)
MFC課程設(shè)計(jì)報(bào)告_第2頁(yè)
MFC課程設(shè)計(jì)報(bào)告_第3頁(yè)
MFC課程設(shè)計(jì)報(bào)告_第4頁(yè)
MFC課程設(shè)計(jì)報(bào)告_第5頁(yè)
已閱讀5頁(yè),還剩19頁(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)介

PAGE計(jì)算機(jī)科學(xué)與工程學(xué)院項(xiàng)目報(bào)告設(shè)計(jì)名稱:《Windows程序設(shè)計(jì)》綜合項(xiàng)目設(shè)計(jì)題目:音頻播放器的制作學(xué)生學(xué)號(hào):xxxxxxxxxx專業(yè)班級(jí):xxxxxxxx級(jí)xxxxxxxxxx班學(xué)生姓名:xxxxxxxx學(xué)生成績(jī):指導(dǎo)教師(職稱):xxxxxxxxxxxxxx課題工作時(shí)間:xxxxxxxxxxxxxxxx課程綜合設(shè)計(jì)摘要(中文音頻播放器,是目前用戶選擇播放任意格式的音頻文件的軟件,如酷狗、QQ音樂(lè)等。一般的音頻播放器,都可以支持MP3、wave、AU、VOC等文件格式的播放。在此次設(shè)計(jì)的音頻播放其中,可以實(shí)現(xiàn)對(duì)音頻文件的打開、播放、暫停、停止、上一曲/下一曲、歌詞顯示等操作。對(duì)于播放器的界面,可以最小化,并顯示到托盤。處于最小化的狀態(tài)下,依然可以對(duì)正在播放的文件進(jìn)行上述操作。在此播放器中,最具特點(diǎn)的是在各個(gè)操作按鈕以及整個(gè)界面上添加了位圖和能將窗口最小化。播放器窗口的建立,也有區(qū)別與傳統(tǒng)的有菜單顯示的窗口。最小化到托盤后,仍可以進(jìn)行操作,也可以選擇退出。對(duì)于實(shí)現(xiàn)播放、停止、上一曲/下一曲、添加文件,都是利用CMidi這個(gè)類來(lái)存放實(shí)現(xiàn)這些功能的函數(shù)。需要的時(shí)候調(diào)用就可以。為了是界面更美觀,讓人看起來(lái)更舒服,加入了位圖背景。目前還沒(méi)有實(shí)現(xiàn)用戶根據(jù)自己的喜好來(lái)更改背景圖案。通過(guò)這次課程設(shè)計(jì),更加鞏固了我們所學(xué)的知識(shí)。課程綜合設(shè)計(jì)摘要(英文):Audioplayeristhesoftwarethatuserschoosetoplayanyformatofaudiofiles,suchascooldogs,QQmusicandsoon.GeneralaudioplayercansupportMP3,wave,AU,VOCfileformatplayback.Inthedesignoftheaudioplayswhichcanbeachievedonanaudiofiletoopen,play,pause,stop,previoussong/nextsong,lyricsdisplayandsoon.Interfaceoftheplayercanbeminimized,anddisplayedtothetray.Inminimizedstate,cantheseoperationstothefilewhileitisplaying.Inthisplayer,mostfeaturesareineachactionbuttonandtheinterface,addthebitmapandcanminimizethewindow.Establishmentoftheplayerwindow,therearedifferencesandtraditionalmenudisplaywindow.Minimizetothetray,youcanstilloperate,youcanalsochoosetoexit.Forachievingtheplay,stop,previoussong/nextsong,andaddingfiles,areusingCMidiclasstoholdthesefeaturesfunction.Needtocallwhenyoucan.Inordertointerfacemorebeautifulis,peopleseemmorecomfortable,hasjoinedabitmapbackground.Thereisnouseraccordingtotheirownpreferencestochangethebackgroundpattern.Throughthiscurriculumdesign,furtherconsolidateourknowledge武漢工程大學(xué)計(jì)算機(jī)科學(xué)與工程學(xué)院綜合設(shè)計(jì)報(bào)告-PAGE12-武漢工程大學(xué)計(jì)算機(jī)科學(xué)與工程學(xué)院綜合設(shè)計(jì)報(bào)告-PAGEI-目錄摘要 IAbstract II第一章課題背景和概述 11.1課題背景 11.1.1音頻播放器簡(jiǎn)介 11.1.2目的和意義 11.2課題概述 11.2.1功能簡(jiǎn)介 11.2.2主要工作和理論依據(jù) 1第二章設(shè)計(jì)簡(jiǎn)介及設(shè)計(jì)方案論述 32.1需求分析 32.2系統(tǒng)功能及結(jié)構(gòu)簡(jiǎn)介 32.2.1系統(tǒng)功能 32.2.2系統(tǒng)結(jié)構(gòu) 3第三章詳細(xì)設(shè)計(jì) 43.1界面設(shè)計(jì) 43.1.1播放器界面設(shè)計(jì) 43.1.2按鈕上的位圖顯示 53.2各模塊功能設(shè)計(jì) 63.2.1各按鈕功能的實(shí)現(xiàn) 63.2.2最小化到托盤 73.2.3進(jìn)度條顯示 7第四章設(shè)計(jì)結(jié)果及分析 84.1運(yùn)行結(jié)果顯示 84.1.1打開文件并播放 84.1.2最小化 84.1.3歌詞顯示 94.2結(jié)果分析和不足 9總結(jié) 10致謝 11參考文獻(xiàn) 12附錄 13摘要音頻播放器,是目前用戶選擇播放任意格式的音頻文件的軟件,如酷狗、QQ音樂(lè)等。一般的音頻播放器,都可以支持MP3、wave、AU、VOC等文件格式的播放。在此次設(shè)計(jì)的音頻播放其中,可以實(shí)現(xiàn)對(duì)音頻文件的打開、播放、暫停、停止、上一曲/下一曲、歌詞顯示等操作。對(duì)于播放器的界面,可以最小化,并顯示到托盤。處于最小化的狀態(tài)下,依然可以對(duì)正在播放的文件進(jìn)行上述操作。在此播放器中,最具特點(diǎn)的是在各個(gè)操作按鈕以及整個(gè)界面上添加了位圖和能將窗口最小化。播放器窗口的建立,也有區(qū)別與傳統(tǒng)的有菜單顯示的窗口。最小化到托盤后,仍可以進(jìn)行操作,也可以選擇退出。對(duì)于實(shí)現(xiàn)播放、停止、上一曲/下一曲、添加文件,都是利用CMidi這個(gè)類來(lái)存放實(shí)現(xiàn)這些功能的函數(shù)。需要的時(shí)候調(diào)用就可以。為了是界面更美觀,讓人看起來(lái)更舒服,加入了位圖背景。目前還沒(méi)有實(shí)現(xiàn)用戶根據(jù)自己的喜好來(lái)更改背景圖案。通過(guò)這次課程設(shè)計(jì),更加鞏固了我們所學(xué)的知識(shí)。關(guān)鍵詞:音頻播放器;功能實(shí)現(xiàn);窗口界面;程序代碼AbstractAudioplayeristhesoftwarethatuserschoosetoplayanyformatofaudiofiles,suchascooldogs,QQmusicandsoon.GeneralaudioplayercansupportMP3,wave,AU,VOCfileformatplayback.Inthedesignoftheaudioplayswhichcanbeachievedonanaudiofiletoopen,play,pause,stop,previoussong/nextsong,lyricsdisplayandsoon.Interfaceoftheplayercanbeminimized,anddisplayedtothetray.Inminimizedstate,cantheseoperationstothefilewhileitisplaying.Inthisplayer,mostfeaturesareineachactionbuttonandtheinterface,addthebitmapandcanminimizethewindow.Establishmentoftheplayerwindow,therearedifferencesandtraditionalmenudisplaywindow.Minimizetothetray,youcanstilloperate,youcanalsochoosetoexit.Forachievingtheplay,stop,previoussong/nextsong,andaddingfiles,areusingCMidiclasstoholdthesefeaturesfunction.Needtocallwhenyoucan.Inordertointerfacemorebeautifulis,peopleseemmorecomfortable,hasjoinedabitmapbackground.Thereisnouseraccordingtotheirownpreferencestochangethebackgroundpattern.Throughthiscurriculumdesign,furtherconsolidateourknowledge.Keywords:Audioplayer;Features;Windowinterfacecode-PAGE1-第一章課題背景和概述1.1課題背景1.1.1音頻播放器簡(jiǎn)介音頻播放器(audioplayer)是一種可儲(chǔ)存、組織與播放音訊檔案格式的裝置。常被稱為“MP3播放器”(因?yàn)镸P3格式的普遍性),它可以播放很多其他的格式,如WMA,AAC,WAV等。一些格式會(huì)跟有限制性的技術(shù)DRM合并,比如Janus和FairPlay,一般是一些付費(fèi)下載網(wǎng)站的一部分。其它一些格式則是完全的專利自由或者在另外一些方面開放,比如OggVorbis,F(xiàn)LAC,Speex(Ogg開放多媒體工程的所有部分),以及Modulefile格式。1.1.2目的和意義通過(guò)獨(dú)立設(shè)計(jì)完成制作一個(gè)播放器軟件,更加理解了MFC單文檔和多文檔程序的構(gòu)成框架,以及各個(gè)類之間數(shù)據(jù)傳遞的關(guān)系。同時(shí),對(duì)鼠標(biāo)和鍵盤的多消息響應(yīng)有了進(jìn)一步的認(rèn)識(shí)。在設(shè)計(jì)制作的過(guò)程中,C++語(yǔ)言是基礎(chǔ),在熟悉MFCWindows程序設(shè)計(jì)的同時(shí),也復(fù)習(xí)了C++程序語(yǔ)言設(shè)計(jì)。1.2課題概述1.2.1功能簡(jiǎn)介本次設(shè)計(jì)完成的播放器軟件,能夠支持播放多種格式的音頻文件,常見的如MP3,WMA,AAC,WAV等。對(duì)正在播放的歌曲,可以進(jìn)行暫停、停止的操作,也可以任意添加歌曲并選擇播放。此播放器也可以最小化和最小化到托盤,方便用戶在播放音樂(lè)的時(shí)候,免受打擾。也可以在最小化到托盤的狀態(tài)下,退出播放器。本次課程設(shè)計(jì),主要是檢驗(yàn)這一學(xué)期,我們通過(guò)對(duì)MFCWindows應(yīng)用程序設(shè)計(jì)這門課學(xué)習(xí),能夠把所學(xué)的知識(shí)應(yīng)用到實(shí)際的能力。1.2.2主要工作和理論依據(jù)MFC類庫(kù)將所有圖形用戶界面的元素如窗口、菜單和按鈕等都以類的形式進(jìn)行了封裝,MFCAppWizard向?qū)Ц鶕?jù)繼承性利用MFC派生出自己的類,并對(duì)Windows應(yīng)用程序進(jìn)行了分解,利用MFC派生類對(duì)應(yīng)用程序重新進(jìn)行組裝,同時(shí)還規(guī)定了應(yīng)用程序中各個(gè)MFC派生類對(duì)象之間的相互聯(lián)系,實(shí)現(xiàn)了標(biāo)準(zhǔn)Windows應(yīng)用程序的功能,這就是向?qū)傻乃^MFC應(yīng)用程序框架。每個(gè)MFC類都包括了一些函數(shù),函數(shù)放到類中,符合C++編程方法。這些函數(shù),必須通過(guò)類定義對(duì)象才能使用。在本次設(shè)計(jì)中,首先,理清課程設(shè)計(jì)和編寫程序的思路,明確程序中所要用到的函數(shù),并做好了解。然后,再利用C++類的繼承與派生原理來(lái)構(gòu)造所需要的類,編寫實(shí)現(xiàn)每項(xiàng)功能的詳細(xì)代碼。利用MFC提供的菜單資源來(lái)創(chuàng)建菜單,通過(guò)類向?qū)Ы㈩?,函?shù),或者消息響應(yīng),來(lái)實(shí)現(xiàn)播放器的各種功能。采用不同的Windows提供的坐標(biāo)系統(tǒng)和對(duì)話框資源,并利用設(shè)備環(huán)境來(lái)繪制和更新圖形,使播放器的界面更加美觀,實(shí)現(xiàn)較好的人機(jī)交互界面。第二章設(shè)計(jì)簡(jiǎn)介及設(shè)計(jì)方案論述2.1需求分析隨著社會(huì)的發(fā)展,有越來(lái)越多的人接觸電腦,也有越來(lái)越多的人喜歡在上網(wǎng)、工作的時(shí)候,播放一點(diǎn)音樂(lè),娛樂(lè)一下,緩解一下。所以,應(yīng)運(yùn)而生的是音頻播放器軟件,能夠?yàn)橛脩舨シ懦R姷母袷揭纛l文件。并且,在使用的過(guò)程中,也盡可能設(shè)計(jì)出一些人性化的設(shè)計(jì)。比如,能最小化到托盤并可以進(jìn)行操作。良好的人機(jī)交互界面,也能給人以美好的感官享受。2.2系統(tǒng)功能及結(jié)構(gòu)簡(jiǎn)介2.2.1系統(tǒng)功能此音頻播放器可以播放多格式的音頻文件。在播放的時(shí)候,需要打開本地的音樂(lè)文件,選擇想要打開的文件,點(diǎn)擊播放便可以播放。在播放的過(guò)程中,如果有事離開想要停止播放,可以點(diǎn)擊暫停按鈕,等到需要的時(shí)候,仍然可以點(diǎn)擊播放,繼續(xù)播放。如果需要退出,點(diǎn)擊關(guān)閉按鈕即可。如果是出于最小化到托盤的狀態(tài),點(diǎn)擊右鍵選擇退出即可。如果想換首歌,點(diǎn)擊下一首或者上一首的按鈕便可以了。對(duì)于想詳細(xì)了解歌曲歌詞內(nèi)容,點(diǎn)擊界面上的“歌詞按鈕”,便可以顯示歌詞。為了能夠讓在進(jìn)行其它操作的用戶不受打擾,可以將此播放器最小化到托盤。與此同時(shí),用戶依然能夠通過(guò)點(diǎn)擊鼠標(biāo)右鍵進(jìn)行相關(guān)的操作。2.2.2系統(tǒng)結(jié)構(gòu)此播放器編寫的時(shí)候,利用的是MFC單文檔程序的構(gòu)成框架,然后再利用Windows提供的資源,運(yùn)用控件,自己制作了對(duì)話框和人機(jī)交互界面。在制作界面的同時(shí),也制作了各個(gè)按鈕,并完成各個(gè)按鈕的消息響應(yīng),便完成響應(yīng)函數(shù)實(shí)現(xiàn)了功能。第三章詳細(xì)設(shè)計(jì)3.1界面設(shè)計(jì)3.1.1播放器界面設(shè)計(jì)此播放器的界面是利用控件和位圖的結(jié)合制作出來(lái)了。打開VCC++6.0新建一個(gè)工程,選擇單文檔。便生成了一個(gè)窗口。然后打開ResouceView,點(diǎn)開Dialog,插入Dialog,利用控件,繪制各個(gè)按鈕。為了使各個(gè)按鈕更加美觀,使用位圖,用自己收集的圖片將各個(gè)按鈕覆蓋,最后添加消息響應(yīng)函數(shù),實(shí)現(xiàn)各個(gè)功能。為了使所引入的位圖能夠和所繪制的窗口能完全吻合,在OnPaint()函數(shù)中,調(diào)用StretchBlt()函數(shù),讓其從源矩形中復(fù)制一個(gè)位圖到目標(biāo)矩形,必要時(shí)按目前目標(biāo)設(shè)備設(shè)置的模式進(jìn)行圖像的拉伸或壓縮。圖3-1按鈕繪制最后生成的界面比較美觀,給人的感覺(jué)很好圖3-3播放器界面3.1.2按鈕上的位圖顯示為對(duì)話框添加9個(gè)按鈕(Button),在Styles標(biāo)簽中選中Bitmap屬性。將它們的ID分別為IDC_Play,IDC_Stop_BUTTON,IDC_Next_BUTTON,IDC_Pre_BUTTON,IDC_Add_Song,IDC_Delet_Song,IDC_GC_BUTTON,IDC_MinWindow,ID_CloseWindow以實(shí)現(xiàn)對(duì)文件的各項(xiàng)操作。將5幅準(zhǔn)備好的位圖加入資源,其ID分別設(shè)為IDC_Play,IDC_Stop_BUTTON,IDC_Next_BUTTON,IDC_Pre_BUTTON,IDC_Add_Song,IDC_Delet_Song,IDC_GC_BUTTON,IDC_MinWindow,ID_CloseWindow,分別和5個(gè)按鈕相對(duì)應(yīng)。然后,在ClassWizard里為每個(gè)按鈕分別添加一個(gè)CBitmapButton型的變量,分別命名為m_BitmapBtn_Delete;m_BitmapBtn_Stop;m_BitmapBtn_MinWindow;m_BitmapBtn_MaxWindow;m_BitmapBtn_CloseWindow;m_BitmapBtn_NextSong;m_BitmapBtn_UpSong;m_BitmapBtn_paly;m_BitmapBtn_Add;m_BitmapBtn_GC;以對(duì)按鈕進(jìn)行操作。圖3-2各個(gè)成員函數(shù)和成員變量3.2各模塊功能設(shè)計(jì)3.2.1各按鈕功能的實(shí)現(xiàn)(1)處理“打開”按鈕單擊“打開”按鈕后,在OnAddSong()函數(shù)中,首先對(duì)文件類型進(jìn)行過(guò)濾,調(diào)用OpenFiles()函數(shù)打開對(duì)話框選擇一個(gè)音頻文件,通過(guò)InitPath()函數(shù)獲取文件路徑,通過(guò)InitPath()函數(shù)獲取文件名后,調(diào)用SaveList()函數(shù)在StaticText控件上顯示你所選擇的歌曲文件名,然后再單擊播放按鈕,便可以播放歌曲。(2)處理“播放”按鈕單擊“播放”按鈕后,在OnPlay()函數(shù)中,通過(guò)調(diào)用Midi類中的Open()函數(shù)獲取剛才選擇的文件路徑以及文件名,調(diào)用該類的Midi類中的Play()函數(shù)播放歌曲,此時(shí)調(diào)用DisplayInfo()函數(shù)在StaticText控件上顯示正在播放的歌曲,進(jìn)行歌曲的播放,然后利用GetDlgItem()函數(shù)設(shè)置“播放”按鈕不可用。(3)處理“停止”按鈕單擊“停止”按鈕后,在OnStopBUTTON()函數(shù)中,首先通過(guò)調(diào)用Midi類的Stop()函數(shù)停止正在播放的歌曲,此時(shí)的歌曲處于暫停時(shí)的進(jìn)度上,利用GetDlgItem()函數(shù)設(shè)置“播放”按鈕可用。(5)處理“上一曲/下一曲”按鈕單擊“上一曲”按鈕時(shí),在OnNextBUTTON()函數(shù)中,通過(guò)調(diào)用Midi類中的Next()函數(shù),停止當(dāng)前播放放的歌曲,并播放當(dāng)前列表中的下一曲。“下一曲”按鈕的處理與“上一曲”類似。(6)處理“最小化”按鈕單擊“最小化”按鈕時(shí),在OnMinWindow()函數(shù)中,通過(guò)調(diào)用ToTray()函數(shù),將當(dāng)前顯示的窗口最小化,并顯示在任務(wù)欄,在此情況下,仍就可以進(jìn)行上述操作。(7)處理“歌詞”按鈕單擊“歌詞”按鈕時(shí),會(huì)在原有的窗口之外再?gòu)棾鲆粋€(gè)窗口,以此來(lái)顯示歌詞。這需要在這整個(gè)工程中新建一個(gè)GECI類,來(lái)繪制顯示歌詞的窗口。整個(gè)繪制的過(guò)程,與界面的設(shè)計(jì)是相類似的。(8)處理“關(guān)閉”按鈕單擊“關(guān)閉”按鈕后,在OnCloseWindow()函數(shù)中,調(diào)用CDialog類的OnOK()函數(shù)將退出對(duì)話框,結(jié)束程序的運(yùn)行。3.2.2最小化到托盤單擊“最小化”按鈕時(shí),在OnMinWindow()函數(shù)中,通過(guò)調(diào)用ToTray()函數(shù),當(dāng)先窗口會(huì)被最小化至托盤。在這個(gè)過(guò)程中,ToTray()函數(shù)只能實(shí)現(xiàn)最小化,并不能實(shí)現(xiàn)在最小化的情況下進(jìn)行操作。在最小化至托盤后,要進(jìn)行操作,就定義了一個(gè)OnShowTask(WPARAMwParam,LPARAMlParam)的函數(shù),利用if、switch語(yǔ)句進(jìn)行判斷。首先要通過(guò)鼠標(biāo)的行為來(lái)獲取最小化之后圖標(biāo)的ID。得到響應(yīng)后,單擊右鍵,顯示彈出式menu。menu.AppendMenu(MF_STRING,IDC_Next_BUTTON,"下一曲");menu.AppendMenu(MF_STRING,IDC_Pre_BUTTON,"上一曲");menu.AppendMenu(MF_STRING,IDC_Stop_BUTTON,"停止");menu.AppendMenu(MF_STRING,IDC_Play,"播放|暫停");menu.AppendMenu(MF_STRING,WM_DESTROY,"退出");由此來(lái)確定彈出式菜單的位置。點(diǎn)擊后,鼠標(biāo)得到響應(yīng),并執(zhí)行操作。如果想恢復(fù)到原來(lái)的窗口,雙擊最小化后任務(wù)欄內(nèi)的圖標(biāo)顯示,鼠標(biāo)由WM_LBUTTONDBLCLK實(shí)現(xiàn)雙擊響應(yīng)后,便會(huì)回到原來(lái)的窗口。在此同時(shí),通過(guò)調(diào)用DeleteTray()函數(shù),來(lái)刪除任務(wù)欄里最小化后的圖標(biāo)。3.2.3進(jìn)度條顯示進(jìn)度條在前進(jìn)的過(guò)程中,其總長(zhǎng)度應(yīng)該為歌曲長(zhǎng)度。如果想要在一首歌播放完畢后,進(jìn)度條加好走完,必須先利用GetMediaLength(nLength,bProgress)函數(shù)獲取歌曲長(zhǎng)度,然后利用UpdatePlayTime(BOOLbProgress)函數(shù)不斷更新歌曲播放的時(shí)間,最后通過(guò)OnTimer()來(lái)實(shí)現(xiàn)。第四章設(shè)計(jì)結(jié)果及分析4.1運(yùn)行結(jié)果顯示4.1.1打開文件并播放點(diǎn)擊“添加”按鈕,選擇想要播放的歌曲,所選擇的文件會(huì)顯示在“播放列表”中。想要播放哪一首,點(diǎn)擊播放即可。圖4-1打開文件并播放在播放的過(guò)程中,依舊存在一些問(wèn)題。比如,不能通過(guò)雙擊歌曲來(lái)達(dá)到播放的目的。如果想完成“上一曲/下一曲”的操作,在添加歌曲文件的時(shí)候,必須是一次性的添加多首歌曲。如果每次只添加一首,添加多次,便不能完成歌曲之間的更換。4.1.2最小化當(dāng)需要最小化是,點(diǎn)擊最小化按鈕,窗口將自動(dòng)最小化到托盤。圖4-3最小化到托盤最小化時(shí),單擊右鍵會(huì)出現(xiàn)如圖所示的菜單。單擊菜單中的選項(xiàng),也可以完成操作。4.1.3歌詞顯示點(diǎn)擊“歌詞”按鈕時(shí),會(huì)彈出另一個(gè)窗口來(lái)顯示歌詞。由于沒(méi)有導(dǎo)入歌詞文本,所以歌詞內(nèi)容無(wú)法顯示。圖4-4歌詞顯示4.2結(jié)果分析和不足雖然說(shuō)這次的設(shè)計(jì)結(jié)果,從表面上看來(lái),基本功能是實(shí)現(xiàn)了。但依舊還是存在很多不足。最突出的就是進(jìn)度條的問(wèn)題。進(jìn)度條在前進(jìn)的過(guò)程中,其總長(zhǎng)度應(yīng)該為歌曲長(zhǎng)度。如果想要在一首歌播放完畢后,進(jìn)度條加好走完,必須先利用GetMediaLength(nLength,bProgress)函數(shù)獲取歌曲長(zhǎng)度,然后利用UpdatePlayTime(BOOLbProgress)函數(shù)不斷更新歌曲播放的時(shí)間,最后通過(guò)OnTimer()來(lái)實(shí)現(xiàn)。但是在設(shè)計(jì)的過(guò)程中,編譯和連接都沒(méi)有錯(cuò)誤,卻不能運(yùn)行處預(yù)料的結(jié)果,還有明顯的錯(cuò)誤。在網(wǎng)上查閱資料的過(guò)程中,也沒(méi)有找到解決的辦法??偨Y(jié)這一次的課程設(shè)計(jì),對(duì)我個(gè)人來(lái)說(shuō)是相當(dāng)有難度的。在設(shè)計(jì)的過(guò)程中,有很多問(wèn)題不是很清楚,所以走起來(lái)就很困難。有時(shí)候在遇到問(wèn)題的時(shí)候,基本知識(shí)都了解,但是不知道怎么把他們整合起來(lái),知識(shí)沒(méi)有形成系統(tǒng),都是很零散的東西。而且,由于以前的基礎(chǔ)知識(shí)不夠牢固,是的我在這次課程設(shè)計(jì)中感到更加的困難。在設(shè)計(jì)的過(guò)程中,每走一步就會(huì)發(fā)現(xiàn),思路想出來(lái)很容易,但涉及到實(shí)現(xiàn)的時(shí)候,總是有點(diǎn)手足無(wú)措。對(duì)于我的這次課程設(shè)計(jì),里面還有很多要改進(jìn)的地方。在播放器的界面上雖然有音量的調(diào)節(jié),但是沒(méi)有有真正的實(shí)現(xiàn);歌詞的具體內(nèi)容額沒(méi)有關(guān)聯(lián)上來(lái)。當(dāng)然一個(gè)程序的順利出爐,少不了的就是反復(fù)的調(diào)試和更改。在調(diào)試的過(guò)程中,總會(huì)發(fā)現(xiàn)很多錯(cuò)誤,在解決這些錯(cuò)誤的同時(shí),開始很模糊的概念,就會(huì)越來(lái)越清晰。其實(shí)有很多錯(cuò)誤都是很類似的,只要解決了一個(gè),其他的也就迎刃而解了。其實(shí),這一個(gè)程序的完成,并不是我一個(gè)人的功勞。有很多不懂的地方就會(huì)向別人請(qǐng)教,同學(xué)之間的相互幫助,確實(shí)能夠解決很多問(wèn)題。致謝特別感謝MFCWindows應(yīng)用程序設(shè)計(jì)老師的悉心指教和幫助,特別是在上課時(shí)候的細(xì)心講解和實(shí)驗(yàn)過(guò)程中詳細(xì)的演示,讓我更加清楚的了解了各個(gè)知識(shí)點(diǎn)的運(yùn)用。通過(guò)這一次的課程設(shè)計(jì),讓我學(xué)到了更多的知識(shí),也把以前掌握不熟練的知識(shí),能更加靈活地運(yùn)用了。謝謝!參考文獻(xiàn)[1]姬濤、周啟生,《計(jì)算機(jī)程序設(shè)計(jì)基礎(chǔ)(上冊(cè))》[Z],北京:中國(guó)傳媒大學(xué)出版社,2010[2]譚浩強(qiáng),《C程序設(shè)計(jì)教程》[Z],北京:清華大學(xué)出版社,2007[3]任哲,《MFCWindows應(yīng)用程序設(shè)計(jì)(第二版)》[Z],北京:清華大學(xué)出版社,2007附錄1.1Cmidi類中的函數(shù)//Midi.cpp#include"stdafx.h"#include"Midi.h"CMidi::CMidi(){ m_totalFiles=0; fr=0; cdfrom=0; m_MusicFilePath=""; PlayingFalg=false; Ispause=false;}CMidi::~CMidi(){}//播放boolCMidi::Play(){if(PlayingFalg)//正在播放則暫停 Pause(); else { if(Ispause) { mciSendCommand(m_count,MCI_RESUME,0,NULL); PlayingFalg=true; Ispause=false; } else { PlayingFalg=true;//標(biāo)志為正在播放 MCI_OPEN_PARMSmciopenparms;//打開 MCI_PLAY_PARMSmciplayparms;//播放 //以下用fr做下標(biāo),能在停止再播放時(shí)恢復(fù)上次的位置 mciopenparms.lpstrElementName=m_FileList[fr];//播放路徑 mciopenparms.lpstrDeviceType=NULL;//文件類型為NULL,就可以支持全部類型 mciSendCommand(0,MCI_OPEN,MCI_DEVTYPE_WAVEFORM_AUDIO, (DWORD)(LPVOID)&mciopenparms);//向MCI設(shè)備發(fā)送命令消息 m_count=mciopenparms.wDeviceID; mciplayparms.dwCallback=NULL;//窗口擁有者句柄 cdlen=getinfo(MCI_STATUS_LENGTH);//得到曲目長(zhǎng)度 cdto=MCI_MAKE_HMS(MCI_HMS_HOUR(cdlen),MCI_HMS_MINUTE(cdlen), MCI_HMS_SECOND(cdlen));//根據(jù)長(zhǎng)度計(jì)算出時(shí)、分、秒 mciplayparms.dwFrom=MCI_MAKE_HMS(0,0,0);//表示從哪兒開始播放吧 mciplayparms.dwTo=cdto;//表示放到哪兒為止 mciSendCommand(m_count,MCI_PLAY,MCI_TO|MCI_FROM, (DWORD)(LPVOID)&mciplayparms); //發(fā)送播放消息 } } returntrue;}//獲取歌曲信息(長(zhǎng)度,已播放長(zhǎng)度)DWORDCMidi::getinfo(DWORDitem){ MCI_STATUS_PARMSmcistatusparms; mcistatusparms.dwCallback=NULL;/* //接受傳入的命令參數(shù),這是關(guān)鍵。命令參數(shù)如下:獲取歌曲長(zhǎng)度:MCI_STATUS_LENGTH獲取當(dāng)前已播放的長(zhǎng)度:MCI_STATUS_POSITION*/ mcistatusparms.dwItem=item;//接受命令參數(shù)的地方 mcistatusparms.dwReturn=0;//返回值 mciSendCommand(m_count,MCI_STATUS,MCI_STATUS_ITEM,(DWORD)&mcistatusparms); returnmcistatusparms.dwReturn;}//停止voidCMidi::Stop(){ PlayingFalg=false;//關(guān)閉正在播放標(biāo)志 cdfrom=MCI_MAKE_HMS(0,0,0);//播放位置歸文件開頭 mciSendCommand(m_count,MCI_CLOSE,0,NULL);//發(fā)出關(guān)閉消息 m_count=0;}//下一首voidCMidi::Next(){ if(fr>=0) { fr++; if(fr>=m_totalFiles) { //讓fr指向下一個(gè)音樂(lè)文件,fr是從0下標(biāo)開始 //m_totalFiles為總文件數(shù) fr=0; } Stop(); Play(); }}//上一首voidCMidi::Per(){ if(fr>=0) { fr--; if(fr==-1) {//指向最后一首歌,但fr是從0下標(biāo)開始的,而m_totalFiles是從1開始 fr=m_totalFiles-1; } Stop(); Play();//播放fr指向的位置 }}//保存曲目列表boolCMidi::SaveList(){ CFilefileList;//文件對(duì)象 if(!fileList.Open(m_MusicFilePath,CFile::modeCreate|CFile::modeWrite)) returnFALSE;//打開文件,不存在則創(chuàng)建,寫文件 charfileName[256]; for(inti=0;i<m_totalFiles;i++) {//m_totalFiles為打開對(duì)話框中獲取的歌曲總數(shù) strcpy(fileName,m_FileList[i]);//取出一條曲目路徑 fileList.Write(fileName,strlen(fileName));//寫入文件 fileList.Write("\r\n",2);//寫入一行結(jié)束和換行符 } fileList.Write("",4);//寫入文件最后標(biāo)志 fileList.Close();//關(guān)閉文件 returnTRUE;}//讀取曲目路徑列表boolCMidi::OpenList(){ CFilefileList; if(!fileList.Open(m_MusicFilePath,CFile::modeNoTruncate|CFile::modeRead)) returnFALSE;//以只讀模式打開,不覆蓋原有文件,m_MusicFilePath為列表文件的路徑 charch; while(1) { CStringfileName; fileList.Read(&ch,1);//讀入一個(gè)字符 if(ch=='-')break;//如文件是最后返回,-是文件最后的標(biāo)志 fileName+=ch;//否則存入 while(1) {//讀入一行 fileList.Read(&ch,1); if(ch=='\r') {//這兒可以判斷是一行了 m_totalFiles++;//曲目首數(shù)計(jì)數(shù) fileList.Read(&ch,1); break; } fileName+=ch; }//下面這句把路徑加入列表中,用字符串?dāng)?shù)組代替 //m_totalFiles前面已經(jīng)加一了,所以這兒要少一個(gè) m_FileList[m_totalFiles-1]=fileName; } fileList.Close(); returnTRUE;}//打開對(duì)話框,獲取曲目列表boolCMidi::OpenFiles(){ CFileDialogf(true);//打開對(duì)話框?qū)ο?f.m_ofn.Flags|=512;//OFN_ALLOWMULTISELECT;目錄列表方式 f.m_ofn.lpstrFilter="所有媒體類型\0*.*\0\0"; if(f.DoModal()!=IDOK) returnFALSE;//用戶單擊了“取消” POSITIONpos=f.GetStartPosition();//獲取第一個(gè)文件位置 inti=0; while(pos) { m_FileList[i]=f.GetNextPathName(pos);//讀取文件到曲目路徑列表 i++; } m_totalFiles=i;//保存曲目總數(shù) Stop(); if(PlayingFalg) Stop(); //Play();//播放打開的文件 returnTRUE;}//獲得播放列表文件的路徑boolCMidi::InitPath(){//初始化路徑,取得播放曲目列表文件的全路徑 TCHARpath[256];//保存文件路徑 GetModuleFileName(NULL,path,sizeof(path));//獲取當(dāng)前程序路徑 TCHAR*p=_tcsrchr(path,_T('\\'));//查找最后一個(gè)'\\'字符 if(p) lstrcpy(p,_T("\\MPlayer.mdr"));//替換成要查找的完整路徑 m_MusicFilePath=path;//保存到路徑變量中,以便用它來(lái)打開列表文件 returntrue;}//循環(huán)播放voidCMidi::OnTimer(){//循環(huán)播放 if(getinfo(MCI_STATUS_POSITION)==cdlen){//如當(dāng)前播放的長(zhǎng)度等于歌曲的長(zhǎng)度,說(shuō)明已經(jīng)播放完畢 Next();//指向下一首 }}//暫停播放voidCMidi::Pause(){ PlayingFalg=false;//關(guān)閉正在播放標(biāo)志 mciSendCommand(m_count,MCI_PAUSE,0,NULL); Ispause=true;}1.2最小化的相關(guān)操作/////////////////////////////////////最小化到托盤開始///////////////////voidCMy2009Dlg::ToTray(){ NOTIFYICONDATAnid; nid.cbSize=(DWORD)sizeof(NOTIFYICONDATA); nid.hWnd=this->m_hWnd; nid.uID=IDR_MAINFRAME; nid.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP; nid.uCallbackMessage=WM_SHOWTASK;//自定義的消息名稱 nid.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME)); strcpy(nid.szTip,"v2009音頻播放器");//信息提示條 Shell_NotifyIcon(NIM_ADD,&nid);//在托盤區(qū)添加圖標(biāo) ShowWindow(SW_HIDE);//隱藏主窗口}/////////

溫馨提示

  • 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)論