• <em id="6vhwh"><rt id="6vhwh"></rt></em>

    <style id="6vhwh"></style>

    <style id="6vhwh"></style>
    1. <style id="6vhwh"></style>
        <sub id="6vhwh"><p id="6vhwh"></p></sub>
        <p id="6vhwh"></p>
          1. 国产亚洲欧洲av综合一区二区三区 ,色爱综合另类图片av,亚洲av免费成人在线,久久热在线视频精品视频,成在人线av无码免费,国产精品一区二区久久毛片,亚洲精品成人片在线观看精品字幕 ,久久亚洲精品成人av秋霞

            基于MFC運(yùn)用windows media player控件實(shí)現(xiàn)的多媒體播放器

            更新時(shí)間:2024-02-25 13:37:05 閱讀: 評(píng)論:0

            2024年2月25日發(fā)(作者:七天退換)

            基于MFC運(yùn)用windows media player控件實(shí)現(xiàn)的多媒體播放器

            基于MFC運(yùn)用windows media player控件實(shí)現(xiàn)的多媒體播放器

            設(shè)計(jì)平臺(tái)

            PC(windows 7 x64),Visual C++ 6.0

            設(shè)計(jì)框圖

            打開MediaPlayer

            MediaPlayer初始化

            打開文件

            列表

            關(guān)于

            播放

            順序播放

            導(dǎo)入/出 選中項(xiàng)上/下移動(dòng) 刪除選中/所有項(xiàng)

            循環(huán)模式

            播放模式

            暫停 音量 快進(jìn)退 上下曲

            停止

            隨機(jī)播放

            退出

            靜音

            一.工程創(chuàng)建

            本程序基于MFC的對(duì)話框模式,起名為MediaPlayer。

            二. 添加Windows Media Player 控件

            在對(duì)話框的空白處點(diǎn)擊右鍵選擇“Inrt ActiveX control”,在彈出的對(duì)話框中找到Windows Media Player。(因?yàn)閃in7系統(tǒng)中沒(méi)有ActiveMovieControl控件所以就用以上控件代替了。)

            2 / 24

            三.為Windows Media Player 控件設(shè)置變量

            在已經(jīng)添加好的控件上單擊右鍵選擇“ClassWizard”,在彈出的窗口中切換到“Member Variables”一欄,找到剛剛添加的控件的ID,選中它然后在右側(cè)的按鈕中點(diǎn)擊“Add Variables”,然后如圖所示:

            這樣就添加成功了。此時(shí)在源文件的對(duì)話框中,系統(tǒng)會(huì)自動(dòng)生成必需的媒體實(shí)現(xiàn)文件。

            3 / 24

            四.播放器界面設(shè)計(jì)

            設(shè)計(jì)的界面如下圖所示,其中播放控制按鈕有打開文件,播放,暫停,停止,快退,快進(jìn),播放列表,全屏,退出,關(guān)于。然后還有音量控制,播放模式,播放進(jìn)度,列表選項(xiàng)的相關(guān)控制器件。

            4 / 24

            控件ID與變量關(guān)聯(lián)如下:

            控件

            WMPlayer

            ListControl

            Slider

            Slider

            ID 變量類型

            CWMPPlayer4

            CListCtrl

            CSliderCtrl

            CSliderCtrl

            int

            變量名稱

            m_player

            m_listCtrl

            m_schedule

            m_VOLUME

            m_order

            響應(yīng)函數(shù)名稱

            OnOpen()

            OnPlay()

            OnPau()

            OnStop()

            OnRever()

            OnForward()

            OnPlayList()

            OnFullScreen()

            OnExit()

            OnSub()

            OnAdd()

            OnLast()

            OnNext()

            OnAbout()

            OnSlience()

            OnListchooup()

            OnListchoodown()

            OnListchoodelet()

            OnListdeleteall()

            OnListimport()

            OnListexport()

            IDC_OCX1

            IDC_LIST1

            IDC_SLIDER1

            IDC_SLIDER2

            Radio Button IDC_ORDER

            按鈕控件的ID和對(duì)應(yīng)的響應(yīng)函數(shù)名稱如下:

            控件名稱

            打開文件

            播放

            暫停

            停止

            快退

            快進(jìn)

            播放列表

            全屏

            退出

            -

            +

            上一曲

            下一曲

            關(guān)于

            靜音

            選中項(xiàng)上移

            選中項(xiàng)下移

            刪除選中項(xiàng)

            刪除所有項(xiàng)

            導(dǎo)入列表

            導(dǎo)出列表

            ID

            IDC_OPEN

            IDC_PLAY

            IDC_PAUSE

            IDC_STOP

            IDC_REVERSE

            IDC_FORWARD

            IDC_PLAYLIST

            IDC_FULLSCREEN

            IDC_EXIT

            IDC_SUB

            IDC_ADD

            IDC_LAST

            IDC_NEXT

            IDC_ABOUT

            IDC_SILENCE

            IDC_LISTCHOOSEUP

            IDC_LISTCHOOSEDOWN

            IDC_LISTCHOOSEDELETE

            IDC_LISTDELETEALL

            IDC_LISTIMPORT

            IDC_LISTEXPORT

            五.功能實(shí)現(xiàn)

            (1)播放控制

            ? Windows Media Player 控件初始化

            在添加該控件的時(shí)候自動(dòng)生成的多個(gè)庫(kù)文件,不同的文件實(shí)現(xiàn)播放器各個(gè)方面的功能,所以需要我們手動(dòng)將他們聯(lián)系起來(lái)。所以我們要在MediaPlayerDlg.h頭文件中添加如下內(nèi)容:

            添加頭文件:

            #include "wmpcontrols.h"

            #include "wmpttings.h"

            #include "wmpplaylist.h"

            5 / 24

            #include "wmpmedia.h"

            添加公共成員:

            CWMPControls m_control;

            CWMPSettings m_tting;

            CWMPMedia m_media;

            在的初始化函數(shù)BOOL CMediaPlayerDlg::OnInitDialog()中添加

            m_control=static_cast(m_trols());

            m_tting=m_tings();

            m_list=static_cast(m_rentPlaylist());

            m_media=static_cast(m_rentMedia());

            將相應(yīng)媒體播放控制文件聯(lián)系起來(lái)。

            ? 打開文件到播放列表

            void CMediaPlayerDlg::OnOpen()

            {

            m_us();

            CString str;

            POSITION pos;

            pos = m_stSelectedItemPosition();

            IndexInFieldList = m_tSelectedItem(pos);

            m_mState(IndexInFieldList,~LVIS_SELECTED,

            LVIS_SELECTED);

            TCHAR szFilter[] =

            _T("Mp3 File(*.mp3)|*.mp3

            |Wma File(*.wma)|*.wma

            |Video File(*.dat)|*.dat

            |Wave File(*.wav)|*.wav

            |AVI File(*.avi)|*.avi

            |Movie File(*.mov)|*.mov

            |Media File(*.mmm)|*.mmm

            |Mid File(*.mid;*,rmi)|*.mid;*.rmi

            |MPEG File(*.mpeg)|*.mpeg

            |All File(*.*)|*.*||");

            CFileDialog fileDlg(TRUE,NULL, NULL,OFN_HIDEREADONLY |

            OFN_OVERWRITEPROMPT, szFilter, this);

            CString strFilePath;

            if (IDOK == l())

            {

            strFilePath = hName();

            per();

            m_(strFilePath);

            m_media=static_cast(m_ia(strFilePath));

            m_Item(m_media);

            m_Item(0,m_e());

            6 / 24

            m_mText(0,1,_T(m_mInfo("FileType")));

            m_mText(0,2,_T(m_ationString()));

            m_mText(0,3,_T(strFilePath));

            m_mText(0,4,_T(m_mInfo("Duration")));

            m_(m_mText(0,3));

            m_mState(0,LVIS_SELECTED,LVIS_SELECTED);

            }

            }

            打開功能實(shí)現(xiàn)分為了兩個(gè)部分,第一部分通過(guò)m_()來(lái)取得媒體文件,第二部分是將媒體文件的相關(guān)信息添加到右側(cè)的播放列表中去,讓列表中的光標(biāo)始終停留在第一欄的位置。

            ? 播放按鈕

            void CMediaPlayerDlg::OnPlay()

            {

            if(m_nt()<=0)

            {

            MessageBox("列表無(wú)文件!","Warning",MB_OK);

            spaceflag=1;

            }

            el

            {

            if(!le(m_()))

            {

            MessageBox("文件不已存在,該列項(xiàng)將被刪除!",

            "Warning",MB_OK);

            CMediaPlayerDlg::OnListchoodelete();

            }

            el

            {

            KillTimer(0);

            m_();

            if(m_rentPosition()==0)

            m_rentPosition(0.01);

            SetTimer(0,20,NULL);

            spaceflag=0;

            }

            }

            }

            播放功能主要是通過(guò)控件提供的m_()來(lái)實(shí)現(xiàn)的。函數(shù)中Timer的設(shè)置和后面的播放模式有關(guān),m_rentPosition(0.01)的目的是為了將未播放狀態(tài)與播放后的停止?fàn)顟B(tài)區(qū)分開來(lái)。

            ? 暫停按鈕

            void CMediaPlayerDlg::OnPau()

            7 / 24

            {

            m_();

            ?

            }

            停止按鈕

            void CMediaPlayerDlg::OnStop()

            {

            KillTimer(0);

            m_();

            }

            全屏模式

            void CMediaPlayerDlg::OnFullscreen()

            {

            if(m_rentPosition()!=0&&!m_lScreen())

            {

            m_();

            m_lScreen(true);

            m_();

            }

            }

            全屏模式存在著bug,就是進(jìn)入到全屏后不能夠接收鍵盤輸入字符,否則整個(gè)程序會(huì)變?yōu)槲错憫?yīng)狀態(tài)。后來(lái)有添加了對(duì)鍵盤信息的獲取和控制函數(shù)來(lái)解決這個(gè)問(wèn)題,后面會(huì)提到。

            快進(jìn)/退

            void CMediaPlayerDlg::OnRever()

            {

            double t = m_rentPosition();

            m_rentPosition(t=t-10); }

            void CMediaPlayerDlg::OnForward()

            {

            double t = m_rentPosition();

            m_rentPosition(t=t+10);

            }

            雖然"wmpcontrols.h"中有直接快進(jìn)、退的相關(guān)函數(shù),但是視頻播放時(shí)是無(wú)效的,所以就沒(méi)有用自帶的函數(shù)來(lái)實(shí)現(xiàn)。這里是通過(guò)m_rentPosition()來(lái)獲得播放媒體的當(dāng)前位置,然后通過(guò)m_rentPosition()來(lái)設(shè)置播放媒體的當(dāng)前位置為原位置+10或-10來(lái)實(shí)現(xiàn)快進(jìn)、退功能。

            播放列表的顯示和隱藏

            void CMediaPlayerDlg::OnPlaylist()

            {

            flag=!flag

            if(flag)

            {

            SetWindowPos(NULL,0,0,440,505,SWP_NOMOVE);

            }

            8 / 24

            ?

            ?

            ?

            el

            {

            SetWindowPos(NULL,0,0,760,505,SWP_NOMOVE);

            }

            }

            從函數(shù)內(nèi)容可以看出,播放列表的顯示和隱藏是通過(guò)設(shè)置主窗體的大小來(lái)實(shí)現(xiàn)的。其中flag為bool型的全局變量,初值為fal。當(dāng)按下播放列表的按鈕時(shí)會(huì)執(zhí)行SetWindowPos(NULL,0,0,420,454,SWP_NOMOVE);無(wú)相對(duì)移動(dòng),窗口縮小列表隱藏。執(zhí)行另一語(yǔ)句時(shí)列表又會(huì)顯示出來(lái)。

            (2)音量控制

            ? 靜音

            void CMediaPlayerDlg::OnSilence()

            {

            if(!m_e())

            m_e(true);

            el

            m_e(fal);

            }

            通過(guò)調(diào)用函數(shù)m_e()獲取當(dāng)前是否處于靜音狀態(tài),通過(guò)m_e(fal/true)設(shè)置是否靜音。

            ? 加減音量

            void CMediaPlayerDlg::OnAdd()

            {

            m_ume(m_ume()+10);

            //獲得當(dāng)前音量大小,并設(shè)置當(dāng)前音量為原音量大小+10

            m_(m_ume());

            //設(shè)置滑動(dòng)條位置

            }

            void CMediaPlayerDlg::OnSub()

            {

            int Volume=m_ume();

            m_ume(Volume=Volume-10);

            //獲得當(dāng)前音量大小,并設(shè)置當(dāng)前音量為原音量大小+10

            m_(m_ume());

            //設(shè)置滑動(dòng)條位置

            }

            加減音量也可以通過(guò)調(diào)用相應(yīng)的成員函數(shù)來(lái)實(shí)現(xiàn)。在按下“+”、“-”按鈕時(shí),滑動(dòng)條也會(huì)做出相對(duì)應(yīng)的動(dòng)作,滾動(dòng)條需要初始化,會(huì)在下面的播放進(jìn)度中詳細(xì)說(shuō)明。

            9 / 24

            (3)播放模式

            ? 上/下一曲

            void CMediaPlayerDlg::OnLast()

            {

            // TODO: Add your control notification handler code here

            m_us();

            POSITION pos;CString strName;

            UINT flag1 = LVIS_SELECTED|LVIS_FOCUSED;

            pos = m_stSelectedItemPosition();

            IndexInFieldList = m_tSelectedItem(pos);

            if(IndexInFieldList == -1)

            {

            AfxMessageBox("列表內(nèi)沒(méi)有被選中項(xiàng)!");

            return;

            }

            if(IndexInFieldList == 0)

            {

            AfxMessageBox("已經(jīng)到了列表頭部!");

            m_mState(IndexInFieldList, flag1, flag1);

            return;

            }

            m_mState(IndexInFieldList,~LVIS_SELECTED,LVIS_SELECTED);

            m_mState(IndexInFieldList-1, flag1, flag1);

            strName=m_mText(IndexInFieldList-1,3);

            CMediaPlayerDlg::OnStop();

            m_(strName);

            CMediaPlayerDlg::OnPlay();

            }

            void CMediaPlayerDlg::OnNext()

            {

            // TODO: Add your control notification handler code here

            m_us();

            POSITION pos;CString strName;

            UINT flag1 = LVIS_SELECTED|LVIS_FOCUSED;

            pos = m_stSelectedItemPosition();

            IndexInFieldList = m_tSelectedItem(pos);

            if(IndexInFieldList == -1)

            {

            AfxMessageBox("列表內(nèi)沒(méi)有被選中項(xiàng)!");

            return;

            }

            if(IndexInFieldList == m_mCount()-1)

            10 / 24

            {

            AfxMessageBox("已經(jīng)到了列表末尾!");

            m_mState(IndexInFieldList, flag1, flag1);

            return;

            }

            m_mState(IndexInFieldList,~LVIS_SELECTED,LVIS_SELECTED);

            m_mState(IndexInFieldList+1, flag1, flag1);

            strName=m_mText(IndexInFieldList+1,3);

            CMediaPlayerDlg::OnStop();

            m_(strName);

            CMediaPlayerDlg::OnPlay();

            }

            上/下一曲的功能主要是通過(guò)移動(dòng)播放列表中的光標(biāo)來(lái)實(shí)現(xiàn)的。如上一曲的功能實(shí)現(xiàn)過(guò)程為:IndexInFieldList獲得列表光標(biāo)當(dāng)前位置,通過(guò)析構(gòu)函數(shù)m_mState(IndexInFieldList,~LVIS_SELECTED,LVIS_SELECTED)使本行光標(biāo)消失,通過(guò)函數(shù)m_mState(IndexInFieldList-1, flag1, flag1)使光標(biāo)顯示在下一行的位置,strName=m_mText(IndexInFieldList-1,3)獲得光標(biāo)所在行第四欄的信息,在這里也就是列表中媒體文件的路徑,然后再調(diào)用相關(guān)函數(shù)來(lái)進(jìn)行播放。

            ? 四種播放模式(順序播放、隨機(jī)播放、全曲循環(huán)、單曲循環(huán))

            首先我們需要定義一個(gè)Botton Group,在四個(gè)Radio Button選擇一個(gè)單擊右鍵,在彈出菜單中選擇“ClassWizard”,翻到“Member Variables”,找到剛剛選擇的Radio Button的ID,“Add Bariables”添加一個(gè)int型的成員m_order,如圖所示:

            然后再在中填寫各個(gè)Radio Button函數(shù)中的內(nèi)容:

            void CMediaPlayerDlg::OnOrder()

            {

            //順序播放

            m_order=0;

            }

            11 / 24

            void CMediaPlayerDlg::OnRandom()

            {

            // 隨機(jī)播放

            m_order=1;

            }

            void CMediaPlayerDlg::OnAllcircle()

            {

            //全曲循環(huán)

            m_order=2;

            }

            void CMediaPlayerDlg::OnSinglecircle()

            {

            // 單曲循環(huán)

            m_order=3;

            }

            之前在ClassWizard中已經(jīng)添加好了OnTimer成員。這時(shí)我們要把它聯(lián)合起來(lái)使用:

            (關(guān)鍵代碼)

            CMediaPlayerDlg::OnTimer(UINT nIDEvent)

            {//計(jì)時(shí)器的選擇代碼省略

            switch(m_order)

            {

            ca 0:

            {

            KillTimer(0);

            POSITION pos;

            pos = m_stSelectedItemPosition();

            IndexInFieldList = m_tSelectedItem(pos);

            m_us();

            if(IndexInFieldList == m_mCount()-1)

            {

            m_mState(IndexInFieldList, LVIS_SELECTED,LVIS_SELECTED);

            m_();

            return;

            }

            m_mState(IndexInFieldList,~LVIS_SELECTED,

            LVIS_SELECTED);

            m_mState(IndexInFieldList+1, LVIS_SELECTED,LVIS_SELECTED);

            CString strName=m_mText(IndexInFieldList+1,3);

            m_(strName);

            CMediaPlayerDlg::OnPlay();

            break;

            12 / 24

            }

            ca 1:

            {

            KillTimer(0);

            m_us();

            POSITION pos;

            pos = m_stSelectedItemPosition();

            IndexInFieldList = m_tSelectedItem(pos);

            m_mState(IndexInFieldList,~LVIS_SELECTED,

            LVIS_SELECTED);

            int i;

            srand((unsigned)time( NULL ));

            i=rand()%m_mCount();

            m_mState(i, LVIS_SELECTED,LVIS_SELECTED);

            CString strName=m_mText(i,3);

            m_(strName);

            CMediaPlayerDlg::OnPlay();

            break;

            }

            ca 2:

            {

            KillTimer(0);

            POSITION pos;

            pos = m_stSelectedItemPosition();

            IndexInFieldList = m_tSelectedItem(pos);

            m_us();

            if(IndexInFieldList == m_mCount()-1)

            {

            IndexInFieldList=-1;

            }

            m_mState(IndexInFieldList,~LVIS_SELECTED,

            LVIS_SELECTED);

            m_mState(IndexInFieldList+1, LVIS_SELECTED,

            LVIS_SELECTED);

            CString strName=m_mText(IndexInFieldList+1,3);

            m_(strName);

            CMediaPlayerDlg::OnPlay();

            break;

            ca 3:

            {

            KillTimer(0);

            m_rentPosition(0.01);

            m_();

            13 / 24

            }

            SetTimer(0,20,NULL);

            break;

            }

            default:

            {

            KillTimer(0);

            break;

            }

            }

            各種播放模式的實(shí)現(xiàn)都是通過(guò)對(duì)播放列表進(jìn)行操作來(lái)實(shí)現(xiàn)的。具體來(lái)講就是通過(guò)控制列表中的光標(biāo)的移動(dòng)來(lái)獲取光標(biāo)所在行的相關(guān)信息。

            (4)播放進(jìn)度

            ? 滾動(dòng)條和數(shù)值顯示

            因?yàn)樗麄児餐瑯?gòu)成一個(gè)整體,又在同一個(gè)OnTimer()函數(shù)中,所以就合起來(lái)說(shuō)明。

            首先為IDC_SLIDER1添加CSliderCtrl類型的成員m_schedule;

            然后是滾動(dòng)條的初始化,在的OnInitDialog()中添加語(yǔ)句:

            m_ge(0,200,fal);

            m_Freq(1);

            m_eSize(1);

            m_(0);

            最后在對(duì)OnTimer()進(jìn)行編輯:

            void CMediaPlayerDlg::OnTimer(UINT nIDEvent)

            {

            switch(nIDEvent)

            {

            ca 0:

            {

            If(m_rentPosition()==0);

            SetDlgItemText(IDC_CURRENT,"00:00");

            SetDlgItemText(IDC_DURATION,"00:00");

            //下面是有關(guān)播放模式的代碼,在這里省略

            //……

            POSITION pos;double td;

            pos = m_stSelectedItemPosition();

            IndexInFieldList = m_tSelectedItem(pos);

            td=_ttol(m_mText(IndexInFieldList,4));

            m_(

            (int)((m_rentPosition()/td)*200));

            SetDlgItemText(IDC_DURATION,

            m_mText(IndexInFieldList,2));

            SetDlgItemText(IDC_CURRENT,

            14 / 24

            }

            }

            CDialog::OnTimer(nIDEvent);

            m_rentPositionString());

            break;

            }

            此處的nIDEvent就是你前面設(shè)置的Timer的編號(hào),當(dāng)編號(hào)為0的時(shí)候就執(zhí)行下面的語(yǔ)句。SetDlgItemText()讓媒體的當(dāng)前播放的位置和總長(zhǎng)度以數(shù)值的形式顯示出來(lái)。

            5)列表選項(xiàng)

            ? 選中項(xiàng)上下移動(dòng)

            void CMediaPlayerDlg::OnListchooup()

            {

            // TODO: Add your control notification handler code here

            m_us();

            POSITION pos;

            int num;

            CString name;

            CString form;

            CString length;

            CString strName;

            CString duration;

            UINT flag1 = LVIS_SELECTED|LVIS_FOCUSED;

            pos = m_stSelectedItemPosition();

            IndexInFieldList = m_tSelectedItem(pos);

            if(IndexInFieldList == -1)

            {

            AfxMessageBox("列表內(nèi)沒(méi)有被選中項(xiàng)!");

            return;

            }

            if(IndexInFieldList == 0)

            {

            AfxMessageBox("已經(jīng)到了列表頭部!");

            m_mState(IndexInFieldList, flag1, flag1);

            return;

            }

            num=IndexInFieldList;

            name=m_mText(num,0);

            form=m_mText(num,1);

            length=m_mText(num,2);

            strName=m_mText(num,3);

            duration=m_mText(num,4);

            m_Item(num);

            15 / 24

            m_Item(num-1,_T(name));

            m_mText(num-1,1,_T(form));

            m_mText(num-1,2,_T(length));

            m_mText(num-1,3,_T(strName));

            m_mText(num-1,4,_T(duration));

            m_mState(IndexInFieldList-1, flag1, flag1);

            }

            void CMediaPlayerDlg::OnListchoodown()

            {

            // TODO: Add your control notification handler code here

            m_us();

            POSITION pos;

            int num;

            CString name;

            CString form;

            CString length;

            CString strName;

            CString duration;

            UINT flag1 = LVIS_SELECTED|LVIS_FOCUSED;

            pos = m_stSelectedItemPosition();

            IndexInFieldList = m_tSelectedItem(pos);

            if(IndexInFieldList == -1)

            {

            AfxMessageBox("列表內(nèi)沒(méi)有被選中項(xiàng)!");

            return;

            }

            if(IndexInFieldList == m_mCount()-1)

            {

            AfxMessageBox("已經(jīng)到了列表末尾!");

            m_mState(IndexInFieldList, flag1, flag1);

            return;

            }

            num=IndexInFieldList;

            name=m_mText(num,0);

            form=m_mText(num,1);

            length=m_mText(num,2);

            strName=m_mText(num,3);

            duration=m_mText(num,4);

            m_Item(num);

            m_Item(num+1,_T(name));

            m_mText(num+1,1,_T(form));

            m_mText(num+1,2,_T(length));

            m_mText(num+1,3,_T(strName));

            16 / 24

            m_mText(num+1,4,_T(duration));

            m_mState(IndexInFieldList+1, flag1, flag1);

            }

            該功能和上下一曲的實(shí)現(xiàn)方法很相似。將光標(biāo)所在行的信息通過(guò)臨時(shí)變量記錄下來(lái),之后將該行刪除,再通過(guò)m_Item()、m_mText()將臨時(shí)變量記錄下來(lái)的信息插入到前一行或后一行中去并讓光標(biāo)停留在該行。

            ? 刪除選中項(xiàng)

            void CMediaPlayerDlg::OnListchoodelete()

            {

            // TODO: Add your control notification handler code here

            m_us();

            POSITION pos;CString strname;

            int num;

            UINT flag1 = LVIS_SELECTED|LVIS_FOCUSED;

            pos = m_stSelectedItemPosition();

            IndexInFieldList = m_tSelectedItem(pos);

            if(IndexInFieldList == -1)

            {

            AfxMessageBox("列表內(nèi)沒(méi)有被選中項(xiàng)!");

            return;

            }

            num=IndexInFieldList;

            m_Item(num);

            CMediaPlayerDlg::OnStop();

            if(m_mCount()!=0)

            {

            if(IndexInFieldList == m_mCount())

            {

            m_mState(IndexInFieldList-1, flag1, flag1);

            strname=m_mText(IndexInFieldList-1,3);

            m_(strname);

            }

            el

            {

            m_mState(IndexInFieldList, flag1, flag1);

            strname=m_mText(IndexInFieldList,3);

            m_(strname);

            }

            CMediaPlayerDlg::OnPlay();

            }

            }

            刪除選中項(xiàng)通過(guò)m_Item(),不過(guò)要注意刪完該行后光標(biāo)應(yīng)停留在哪里的問(wèn)題。如果刪除行不是最后一行,那么光標(biāo)可以停留在下一行,如何是刪除的最后一行,那么光標(biāo)應(yīng)該停留在上一行。

            17 / 24

            ? 刪除所有項(xiàng)

            void CMediaPlayerDlg::OnListdeleteall()

            {

            // TODO: Add your control notification handler code here

            CMediaPlayerDlg::OnStop();

            int m=m_mCount(),i;

            for(i=m-1;i>=0;i--)

            {

            m_Item(i);

            }

            }

            獲得列表中的行數(shù),從最后一行往上逐行刪除。

            ? 導(dǎo)入列表

            void CMediaPlayerDlg::OnListimport()

            {

            // TODO: Add your control notification handler code here

            m_us();

            TCHAR szFilter[] = _T("列表文件(*.list)|*.list||");

            // 構(gòu)造打開文件對(duì)話框

            CFileDialog fileDlg(TRUE, _T("list"), NULL, 0, szFilter, this);

            CString strFilePath;

            // 顯示打開文件對(duì)話框

            if (IDOK == l())

            {

            // 如果點(diǎn)擊了文件對(duì)話框上的“打開”按鈕,則將選擇的文件路徑顯示到編輯框里

            strFilePath = hName();

            }

            CStdioFile file;int i;

            if((strFilePath,CFile::modeRead|CFile::typeText))

            {

            POSITION pos;

            pos = m_stSelectedItemPosition();

            IndexInFieldList = m_tSelectedItem(pos);

            m_mState(IndexInFieldList,

            ~LVIS_SELECTED,LVIS_SELECTED);

            Begin();

            CString str;CString strtemp[6];

            while(ring(str))

            {

            for(i=0;i<5;i++)

            AfxExtractSubString(strtemp[i],str,i,'|');

            m_Item(0,strtemp[0]);

            m_mText(0,1,_T(strtemp[1]));

            18 / 24

            }

            m_(m_mText(0,3));

            m_mState(0,LVIS_SELECTED,LVIS_SELECTED);

            }

            el

            {

            TRACE("Can't open list file!");

            }

            ();

            m_mText(0,2,_T(strtemp[2]));

            m_mText(0,3,_T(strtemp[3]));

            m_mText(0,4,_T(strtemp[4]));

            m_(strtemp[3]);

            m_media=static_cast(

            m_ia(strFilePath));

            m_Item(m_media);

            }

            找到要導(dǎo)入的列表文件,雖然把文件的后綴名改為了list,實(shí)際上還是文本文件,只是為了與其他的非列表文本文件區(qū)分開來(lái)。

            通過(guò)ring(str)逐行讀取list文件內(nèi)容。

            通過(guò)AfxExtractSubString(strtemp[i],str,i,'|'),將字符串流切分成幾個(gè)小的字符串,記錄在數(shù)組中,再導(dǎo)入列表里面。

            如圖是以文本文件格式打開的list文件:

            ? 導(dǎo)出列表

            void CMediaPlayerDlg::OnListexport()

            {

            // TODO: Add your control notification handler code here

            TCHAR szFilter[]=_T("列表文件(*.list)|*.list||");

            CFileDialog fileDlg(FALSE,_T("list"),NULL,OFN_HIDEREADONLY |

            OFN_OVERWRITEPROMPT, szFilter, this);

            CString strFilePath;

            if (IDOK == l())

            {

            // 如果點(diǎn)擊了文件對(duì)話框上的“保存”按鈕,則將選擇的文件路徑顯示到編輯框里

            strFilePath = hName();

            }

            CStdioFile file;int i,j;

            if((strFilePath,CFile::modeCreate|CFile::modeReadWrite|

            CFile::typeText))

            {

            19 / 24

            for(i=m_mCount()-1;i>=0;i--)

            {

            CString temp;

            for(j=0;j<4;j++)

            {

            temp=m_mText(i,j);

            temp+="|";

            tring(temp);

            }

            temp=m_mText(i,j);

            temp+="n";

            tring(temp);

            }

            ();

            }

            el

            {

            TRACE("Can't Open File");

            }

            }

            前半部分獲取保存路徑,后半部分將列表信息寫入到該路徑下的文件中。

            (6)獲取按鍵信息

            在”ClassWizard”中的”Message Maps”頁(yè)面為”CMediaPlayerDlg”添加”Member

            functions”:PreTranslateMessage如圖所示。

            20 / 24

            再添加如下代碼:

            BOOL CMediaPlayerDlg::PreTranslateMessage(MSG* pMsg)

            {

            // TODO: Add your specialized code here and/or call the ba class

            if(pMsg->message==WM_KEYDOWN)

            {

            switch(pMsg->wParam)

            {

            ca VK_ESCAPE:

            {//ESC鍵

            if(m_rentPosition()!=0&&

            m_lScreen())

            m_lScreen(fal);

            el

            SendMessage(WM_CLOSE);

            return TRUE;

            break;

            }

            ca VK_SPACE:

            {//空格鍵

            if(spaceflag==0)

            CMediaPlayerDlg::OnPau();

            el

            if(spaceflag==1)

            CMediaPlayerDlg::OnPlay();

            return TRUE;

            break;

            }

            ca VK_LEFT:

            {//←鍵

            CMediaPlayerDlg::OnRever();

            return TRUE;

            break;

            }

            ca VK_RIGHT:

            {//→鍵

            CMediaPlayerDlg::OnForward();

            return TRUE;

            break;

            }

            ca VK_PRIOR:

            {//PageUp鍵

            CMediaPlayerDlg::OnLast();

            return TRUE;

            21 / 24

            }

            break;

            }

            ca VK_NEXT:

            {//PageDown鍵

            CMediaPlayerDlg::OnNext();

            return TRUE;

            break;

            }

            ca VK_UP:

            {//↑鍵

            CMediaPlayerDlg::OnAdd();

            return TRUE;

            break;

            }

            ca VK_DOWN:

            {//↓鍵

            CMediaPlayerDlg::OnSub();

            return TRUE;

            break;

            }

            default:

            return TRUE;

            break;

            }

            return CDialog::PreTranslateMessage(pMsg);

            }

            到此,全屏不能碰鍵盤的bug被修復(fù)了,并且也可以通過(guò)鍵盤進(jìn)行媒體播放操作,特別是在全屏播放視頻文件的時(shí)候。

            22 / 24

            實(shí)驗(yàn)結(jié)果

            (1) 音樂(lè)播放測(cè)試

            (2) 視頻播放測(cè)試

            (3) 列表導(dǎo)入測(cè)試

            23 / 24

            (4) 列表導(dǎo)出測(cè)試

            相關(guān)代碼及工程文件下載:

            /share/link?shareid=1420842405&uk=3425060786

            2013-6-30

            24 / 24

            基于MFC運(yùn)用windows media player控件實(shí)現(xiàn)的多媒體播放器

            本文發(fā)布于:2024-02-25 13:37:05,感謝您對(duì)本站的認(rèn)可!

            本文鏈接:http://www.newhan.cn/zhishi/a/1708839425273112.html

            版權(quán)聲明:本站內(nèi)容均來(lái)自互聯(lián)網(wǎng),僅供演示用,請(qǐng)勿用于商業(yè)和其他非法用途。如果侵犯了您的權(quán)益請(qǐng)與我們聯(lián)系,我們將在24小時(shí)內(nèi)刪除。

            本文word下載地址:基于MFC運(yùn)用windows media player控件實(shí)現(xiàn)的多媒體播放器.doc

            本文 PDF 下載地址:基于MFC運(yùn)用windows media player控件實(shí)現(xiàn)的多媒體播放器.pdf

            留言與評(píng)論(共有 0 條評(píng)論)
               
            驗(yàn)證碼:
            推薦文章
            排行榜
            Copyright ?2019-2022 Comsenz Inc.Powered by ? 實(shí)用文體寫作網(wǎng)旗下知識(shí)大全大全欄目是一個(gè)全百科類寶庫(kù)! 優(yōu)秀范文|法律文書|專利查詢|
            主站蜘蛛池模板: 亚洲国产天堂久久国产91| 最近中文字幕完整版2019| 永久免费AV无码国产网站| 久久精品夜夜夜夜夜久久| 亚洲av无码乱码在线观看牲色| 免费看成人毛片无码视频| 国产精品爽黄69天堂A| 中国熟妇毛多多裸交视频| 免费观看一级欧美大| 日本在线视频网站www色下载| 性欧美vr高清极品| 欧美日本在线一区二区三区| 国产欧美精品一区aⅴ影院| 国产99久久亚洲综合精品西瓜tv| 亚在线观看免费视频入口| 姑娘视频在线观看中国电影| 日韩AV中文无码影院| 日韩精品一区二区大桥未久| 日本高清一区二区在线观看 | 久久人妻无码一区二区三区av| 亚洲毛片无码专区亚洲乱| 377P欧洲日本亚洲大胆 | 亚洲欧美日韩另类| 国产亚洲精品国产福利在线观看| 国产精品呻吟一区二区三区| 丝袜国产一区av在线观看| 国精品91人妻无码一区二区三区| 国模少妇无码一区二区三区| 免费人成视频网站在线观看18| 国产熟女丝袜av一二区| 亚洲欧洲国产综合一区二区| 97视频精品全国免费观看| 又粗又硬又黄a级毛片| 久久综合伊人77777| 日韩女同在线二区三区| 日韩精品成人网页视频在线| 日本视频精品一区二区| 国产精品午夜福利免费看| 国产精品_国产精品_k频道| 久久精品第九区免费观看| 亚洲熟妇无码爱V在线观看|