由于最近做的东西需要一个播放器组件,当时想到了media player和TCPMP,最初在PC下做个测试的程序来测试Media Player 组件的使用方法,当时运行在PC上没有任何问题,但是当将代码移植到WinCE上运行时候编译没有报告错误,但是运行时候报告,组件没有注册,通过对于查找网上相关资料,发现WinCE上虽然微软打的是media player 9组件的招牌实际上做的事media player 6.4版本的勾当,通过以下步骤解决该问题
在PC机的控制台中里执行以下命令
:regsvr32 c:\windows\system32\wmp.dll /u 来卸载media player 9版本的组件,
然后再执行
regsvr32 c:\windows\system32\msdxm.ocx 来注册media player6.4版本组件
然后重新构筑程序编译就,运行就可以通过了
media play 的相关一些属性其中ClickToPlay 属性可以设置是否对于鼠标点击响应 如果将该属性设置为false的话这样在在播放时候点击播放界面则播放不会停止。
media play的一些接口方法如下
put_ShowControls(FALSE);//是否显示控制按钮
put_ShowGotoBar(FALSE);是否显示进度
put_ShowPositionControls(FALSE);
put_ShowStatusBar(FALSE);//是否显示状态栏
put_ShowTracker(FALSE);//是显示播放的轨迹
put_DisplaySize(3);//设置播放的宽度 3代表fullsize
/*
enum
{
mpDefaultSize = 0,
mpHalfSize = 1,
mpDoubleSize = 2,
mpFullScreen = 3,
mpFitToSize = 4,
mpOneSixteenthScreen = 5,
mpOneFourthScreen = 6,
mpOneHalfScreen = 7
}MPDisplaySizeConstants;
*/
media player6.4 可以相应的事件消息
EndOfStream //当前播放的文件播放完的事件
Buffering//数据缓冲的事件(根据传的参数可以知道是否缓冲完成)
ReadyStateChange //准备得状态完成
PositionChange //文件位置改变
NewStream //播放新的文件
PlayStateChange//播放状态的改变(传回两个参数第一个为 oldstate 第二个为newstate)
其中playstatechange 主要有以下状态
由于media player6.4组件中对于播放列表的实现不像media palyer9中会自动生成一部分代码。这里我在实现播放列表时候主要借助于这些相关事件来实现的,同时media player 在两个播放文件中间跳转时候会出现显示相关的图标,我这里为了让两个文件跳转显得更加连贯也是通过这些事件来是实现的,为了能够相应media player组件的事件消息 需要添加以下源码
首先在头文件中 声明 DECLARE_EVENTSINK_MAP() 在cpp中添加 BEGIN_EVENTSINK_MAP(CTestDlg, CDialog) //{{AFX_EVENTSINK_MAP(CTestDlg) ON_EVENT(CTestDlg, IDC_MEDIAPLAYER1, 3002 /* EndOfStream */, OnEndOfStreamMediaplayer1, VTS_I4) ON_EVENT(CTestDlg, IDC_MEDIAPLAYER1, 3003 /* Buffering */, OnBufferingMediaplayer1, VTS_BOOL) ON_EVENT(CTestDlg, IDC_MEDIAPLAYER1, -609 /* ReadyStateChange */, OnReadyStateChangeMediaplayer1, VTS_I4) ON_EVENT(CTestDlg, IDC_MEDIAPLAYER1, 2 /* PositionChange */, OnPositionChangeMediaplayer1, VTS_R8 VTS_R8) ON_EVENT(CTestDlg, IDC_MEDIAPLAYER1, 3008 /* NewStream */, OnNewStreamMediaplayer1, VTS_NONE) ON_EVENT(CTestDlg, IDC_MEDIAPLAYER1, 3012 /* PlayStateChange */, OnPlayStateChangeMediaplayer1, VTS_I4 VTS_I4) //}}AFX_EVENTSINK_MAP END_EVENTSINK_MAP() 这样就可以在相应的事件相应函数中填写相应的当该事件发生时候的相应代码
以下为我那个程序的示例程序的主要部分的代码 BEGIN_EVENTSINK_MAP(CElevatorGuiderDlg, CDialog) //{{AFX_EVENTSINK_MAP(CTestDlg) ON_EVENT(CElevatorGuiderDlg, IDC_MEDIAPLAYER1, 3002 /* EndOfStream */, EndOfStream, VTS_I4) ON_EVENT(CElevatorGuiderDlg, IDC_MEDIAPLAYER1, DISPID_READYSTATECHANGE, ReadyStateChangeMediaplayer1, VTS_I4) //}}AFX_EVENTSINK_MAP END_EVENTSINK_MAP() 为了让播放器隐藏时候看起来和没有隐藏差不多在MESSAGEMAP中添加ON_WM_ERASEBKGND()映射
同时在源文件中实现 BOOL CElevatorGuiderDlg:: OnEraseBkgnd(CDC *pDC) { CRect rcClient; GetClientRect(&rcClient); pDC->FillSolidRect(rcClient, RGB(0,0,0)); // 设置窗体的背景为黑色和media player播放器的背景色 黑色一致 return TRUE; } 同时由于如果在两个播放的视频文件切换时候,当视频没有开始播放而处于加载的过程时候不暂时将播放器隐藏的话,会出现media player的那个图标,看起来不太舒服通过增添一下代码实现 void CElevatorGuiderDlg::ReadyStateChangeMediaplayer1(l ong ReadyState) { TRACE(_T("#ReadyStateChangeMediaplayer: %d\n"),ReadyState); if(ReadyState==0) m_MediaPlayer.ShowWindow(SW_HIDE); if(ReadyState==3) m_MediaPlayer.ShowWindow(SW_SHOW); // } 上述代码在Wince6.0 ARM6410上测试通过
在解决问题时候参看了一下网页 组件相关事件:http://blog.csdn.net/ymh8416/archive/2008/03/19/21 97171.aspx
添加对于组件的事件相应:http://blog.csdn.net/xiaoqiqixiao/archive/2006/01/ 09/574542.aspx
在PC机的控制台中里执行以下命令
:regsvr32 c:\windows\system32\wmp.dll /u 来卸载media player 9版本的组件,
然后再执行
regsvr32 c:\windows\system32\msdxm.ocx 来注册media player6.4版本组件
然后重新构筑程序编译就,运行就可以通过了
media play 的相关一些属性其中ClickToPlay 属性可以设置是否对于鼠标点击响应 如果将该属性设置为false的话这样在在播放时候点击播放界面则播放不会停止。
media play的一些接口方法如下
put_ShowControls(FALSE);//是否显示控制按钮
put_ShowGotoBar(FALSE);是否显示进度
put_ShowPositionControls(FALSE);
put_ShowStatusBar(FALSE);//是否显示状态栏
put_ShowTracker(FALSE);//是显示播放的轨迹
put_DisplaySize(3);//设置播放的宽度 3代表fullsize
/*
enum
{
mpDefaultSize = 0,
mpHalfSize = 1,
mpDoubleSize = 2,
mpFullScreen = 3,
mpFitToSize = 4,
mpOneSixteenthScreen = 5,
mpOneFourthScreen = 6,
mpOneHalfScreen = 7
}MPDisplaySizeConstants;
*/
media player6.4 可以相应的事件消息
EndOfStream //当前播放的文件播放完的事件
Buffering//数据缓冲的事件(根据传的参数可以知道是否缓冲完成)
ReadyStateChange //准备得状态完成
PositionChange //文件位置改变
NewStream //播放新的文件
PlayStateChange//播放状态的改变(传回两个参数第一个为 oldstate 第二个为newstate)
其中playstatechange 主要有以下状态
由于media player6.4组件中对于播放列表的实现不像media palyer9中会自动生成一部分代码。这里我在实现播放列表时候主要借助于这些相关事件来实现的,同时media player 在两个播放文件中间跳转时候会出现显示相关的图标,我这里为了让两个文件跳转显得更加连贯也是通过这些事件来是实现的,为了能够相应media player组件的事件消息 需要添加以下源码
首先在头文件中 声明 DECLARE_EVENTSINK_MAP() 在cpp中添加 BEGIN_EVENTSINK_MAP(CTestDlg, CDialog) //{{AFX_EVENTSINK_MAP(CTestDlg) ON_EVENT(CTestDlg, IDC_MEDIAPLAYER1, 3002 /* EndOfStream */, OnEndOfStreamMediaplayer1, VTS_I4) ON_EVENT(CTestDlg, IDC_MEDIAPLAYER1, 3003 /* Buffering */, OnBufferingMediaplayer1, VTS_BOOL) ON_EVENT(CTestDlg, IDC_MEDIAPLAYER1, -609 /* ReadyStateChange */, OnReadyStateChangeMediaplayer1, VTS_I4) ON_EVENT(CTestDlg, IDC_MEDIAPLAYER1, 2 /* PositionChange */, OnPositionChangeMediaplayer1, VTS_R8 VTS_R8) ON_EVENT(CTestDlg, IDC_MEDIAPLAYER1, 3008 /* NewStream */, OnNewStreamMediaplayer1, VTS_NONE) ON_EVENT(CTestDlg, IDC_MEDIAPLAYER1, 3012 /* PlayStateChange */, OnPlayStateChangeMediaplayer1, VTS_I4 VTS_I4) //}}AFX_EVENTSINK_MAP END_EVENTSINK_MAP() 这样就可以在相应的事件相应函数中填写相应的当该事件发生时候的相应代码
以下为我那个程序的示例程序的主要部分的代码 BEGIN_EVENTSINK_MAP(CElevatorGuiderDlg, CDialog) //{{AFX_EVENTSINK_MAP(CTestDlg) ON_EVENT(CElevatorGuiderDlg, IDC_MEDIAPLAYER1, 3002 /* EndOfStream */, EndOfStream, VTS_I4) ON_EVENT(CElevatorGuiderDlg, IDC_MEDIAPLAYER1, DISPID_READYSTATECHANGE, ReadyStateChangeMediaplayer1, VTS_I4) //}}AFX_EVENTSINK_MAP END_EVENTSINK_MAP() 为了让播放器隐藏时候看起来和没有隐藏差不多在MESSAGEMAP中添加ON_WM_ERASEBKGND()映射
同时在源文件中实现 BOOL CElevatorGuiderDlg:: OnEraseBkgnd(CDC *pDC) { CRect rcClient; GetClientRect(&rcClient); pDC->FillSolidRect(rcClient, RGB(0,0,0)); // 设置窗体的背景为黑色和media player播放器的背景色 黑色一致 return TRUE; } 同时由于如果在两个播放的视频文件切换时候,当视频没有开始播放而处于加载的过程时候不暂时将播放器隐藏的话,会出现media player的那个图标,看起来不太舒服通过增添一下代码实现 void CElevatorGuiderDlg::ReadyStateChangeMediaplayer1(l ong ReadyState) { TRACE(_T("#ReadyStateChangeMediaplayer: %d\n"),ReadyState); if(ReadyState==0) m_MediaPlayer.ShowWindow(SW_HIDE); if(ReadyState==3) m_MediaPlayer.ShowWindow(SW_SHOW); // } 上述代码在Wince6.0 ARM6410上测试通过
在解决问题时候参看了一下网页 组件相关事件:http://blog.csdn.net/ymh8416/archive/2008/03/19/21 97171.aspx
添加对于组件的事件相应:http://blog.csdn.net/xiaoqiqixiao/archive/2006/01/ 09/574542.aspx