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

基于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_tting=m_tings();
m_list=static_cast
m_media=static_cast
將相應(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_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
本文發(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)論) |