代码如下:
// 打开视频文件的函数
bool CRealPlayer::OpenFile(HWND hWndParent)
{
DWORD dwReturn;
MCI_DGV_OPEN_PARMS openparms;
ZeroMemory(&openparms,sizeof(MCI_DGV_OPEN_PARMS));
openparms.lpstrDeviceType=TEXT("avivideo");
openparms.lpstrElementName=(LPWSTR)m_FilePath.GetBuffer(0);
openparms.dwStyle=WS_CHILD |WS_VISIBLE;
openparms.hWndParent=hWndParent; this->m_hWndParent=hWndParent; dwReturn=mciSendCommand(NULL,MCI_OPEN,MCI_OPEN_TYPE|MCI_OPEN_ELEMENT|MCI_DGV_OPEN_PARENT,(DWORD) (LPMCI_OPEN_PARMS)(&openparms));
if (dwReturn)//如果失败
{
TRACE("Open File Error\n");
return FALSE;
}
TRACE("Open File Successed\n");
m_deviceId=openparms.wDeviceID;//保存打开设备ID
return TRUE;
}
// 设置指针回到文件的开始
bool CRealPlayer::BackToStart(void)
{
DWORD dwReturn;
dwReturn=mciSendCommand(m_deviceId,MCI_SEEK,MCI_SEEK_TO_START,NULL);
if (dwReturn)//如果失败
{
TRACE("BackToStart Error\n");
return FALSE;
} TRACE("BackToStart Successed\n");
return TRUE;
}// 设置播放的参数
bool CRealPlayer::SetFile(void)
{
DWORD dwReturn;
MCI_DGV_SET_PARMS setparms;
ZeroMemory(&setparms,sizeof(MCI_DGV_SET_PARMS));
setparms.dwTimeFormat=MCI_FORMAT_FRAMES;//将文件长度单位设置为帧 dwReturn=mciSendCommand(m_deviceId,MCI_SET,MCI_SET_TIME_FORMAT,(DWORD) (LPMCI_SET_PARMS)&setparms);
if (dwReturn)//如果失败
{
TRACE("SetFile Error\n");
return FALSE; } TRACE("SetFile Successed\n");
return TRUE;
}
//播放视频文件的函数
bool CRealPlayer::PlayFile(void)
{
DWORD dwReturn;
MCI_DGV_PLAY_PARMS playparms;
ZeroMemory(&playparms,sizeof(MCI_DGV_PLAY_PARMS)); MCI_DGV_STATUS_PARMS statusparms;
statusparms.dwItem=MCI_STATUS_POSITION;
ZeroMemory(&statusparms,sizeof(MCI_DGV_STATUS_PARMS));
mciSendCommand(m_deviceId,MCI_STATUS,MCI_STATUS_ITEM |MCI_STATUS_START, (DWORD) (LPMCI_STATUS_PARMS)&statusparms);
playparms.dwFrom=statusparms.dwReturn;
//playparms.dwTo=10000;
dwReturn=mciSendCommand(m_deviceId,MCI_PLAY,MCI_FROM,(DWORD) (LPMCI_PLAY_PARMS )&playparms);
if (dwReturn)//如果失败
{
TRACE("Play Error\n");
return FALSE;
}
TRACE("Play Successed\n"); ::ShowWindow(m_hWndParent,SW_MAXIMIZE);
return TRUE;
}// 设置视频窗口的大小
bool CRealPlayer::SetRect(CRect rc)
{
MCI_DGV_PUT_PARMS putparms;
ZeroMemory(&putparms,sizeof(MCI_DGV_PUT_PARMS));
putparms.rc.left=0;
putparms.rc.top=0;
putparms.rc.right=rc.right;
putparms.rc.bottom=rc.bottom; DWORD dwReturn;
dwReturn=mciSendCommand(m_deviceId,MCI_PUT,MCI_DGV_PUT_CLIENT|MCI_DGV_PUT_WINDOW/*|MCI_DGV_RECT*/,(DWORD) (LPMCI_GENERIC_PARMS)&putparms);
if (dwReturn)//如果失败
{
TRACE("SetRect Error\n");
return FALSE;
}
TRACE("SetRect Successed\n");
return TRUE;
}
调用的代码如下:
m_player.OpenFile(this->m_hWnd);
m_player.SetFile();
m_player.BackToStart();
CRect rc;
GetClientRect(rc);
m_player.SetRect(rc);
m_player.PlayFile();
开始时是出现一个新的窗口,但是窗口显示“无法播放视频,缺少DIVS解压缩程序”,后面下载安装了DIVS后,窗口变成透明,就是一些窗口底下的其他东西,还是没有视频出来,请教各位前辈这是哪里的问题。
// 打开视频文件的函数
bool CRealPlayer::OpenFile(HWND hWndParent)
{
DWORD dwReturn;
MCI_DGV_OPEN_PARMS openparms;
ZeroMemory(&openparms,sizeof(MCI_DGV_OPEN_PARMS));
openparms.lpstrDeviceType=TEXT("avivideo");
openparms.lpstrElementName=(LPWSTR)m_FilePath.GetBuffer(0);
openparms.dwStyle=WS_CHILD |WS_VISIBLE;
openparms.hWndParent=hWndParent; this->m_hWndParent=hWndParent; dwReturn=mciSendCommand(NULL,MCI_OPEN,MCI_OPEN_TYPE|MCI_OPEN_ELEMENT|MCI_DGV_OPEN_PARENT,(DWORD) (LPMCI_OPEN_PARMS)(&openparms));
if (dwReturn)//如果失败
{
TRACE("Open File Error\n");
return FALSE;
}
TRACE("Open File Successed\n");
m_deviceId=openparms.wDeviceID;//保存打开设备ID
return TRUE;
}
// 设置指针回到文件的开始
bool CRealPlayer::BackToStart(void)
{
DWORD dwReturn;
dwReturn=mciSendCommand(m_deviceId,MCI_SEEK,MCI_SEEK_TO_START,NULL);
if (dwReturn)//如果失败
{
TRACE("BackToStart Error\n");
return FALSE;
} TRACE("BackToStart Successed\n");
return TRUE;
}// 设置播放的参数
bool CRealPlayer::SetFile(void)
{
DWORD dwReturn;
MCI_DGV_SET_PARMS setparms;
ZeroMemory(&setparms,sizeof(MCI_DGV_SET_PARMS));
setparms.dwTimeFormat=MCI_FORMAT_FRAMES;//将文件长度单位设置为帧 dwReturn=mciSendCommand(m_deviceId,MCI_SET,MCI_SET_TIME_FORMAT,(DWORD) (LPMCI_SET_PARMS)&setparms);
if (dwReturn)//如果失败
{
TRACE("SetFile Error\n");
return FALSE; } TRACE("SetFile Successed\n");
return TRUE;
}
//播放视频文件的函数
bool CRealPlayer::PlayFile(void)
{
DWORD dwReturn;
MCI_DGV_PLAY_PARMS playparms;
ZeroMemory(&playparms,sizeof(MCI_DGV_PLAY_PARMS)); MCI_DGV_STATUS_PARMS statusparms;
statusparms.dwItem=MCI_STATUS_POSITION;
ZeroMemory(&statusparms,sizeof(MCI_DGV_STATUS_PARMS));
mciSendCommand(m_deviceId,MCI_STATUS,MCI_STATUS_ITEM |MCI_STATUS_START, (DWORD) (LPMCI_STATUS_PARMS)&statusparms);
playparms.dwFrom=statusparms.dwReturn;
//playparms.dwTo=10000;
dwReturn=mciSendCommand(m_deviceId,MCI_PLAY,MCI_FROM,(DWORD) (LPMCI_PLAY_PARMS )&playparms);
if (dwReturn)//如果失败
{
TRACE("Play Error\n");
return FALSE;
}
TRACE("Play Successed\n"); ::ShowWindow(m_hWndParent,SW_MAXIMIZE);
return TRUE;
}// 设置视频窗口的大小
bool CRealPlayer::SetRect(CRect rc)
{
MCI_DGV_PUT_PARMS putparms;
ZeroMemory(&putparms,sizeof(MCI_DGV_PUT_PARMS));
putparms.rc.left=0;
putparms.rc.top=0;
putparms.rc.right=rc.right;
putparms.rc.bottom=rc.bottom; DWORD dwReturn;
dwReturn=mciSendCommand(m_deviceId,MCI_PUT,MCI_DGV_PUT_CLIENT|MCI_DGV_PUT_WINDOW/*|MCI_DGV_RECT*/,(DWORD) (LPMCI_GENERIC_PARMS)&putparms);
if (dwReturn)//如果失败
{
TRACE("SetRect Error\n");
return FALSE;
}
TRACE("SetRect Successed\n");
return TRUE;
}
调用的代码如下:
m_player.OpenFile(this->m_hWnd);
m_player.SetFile();
m_player.BackToStart();
CRect rc;
GetClientRect(rc);
m_player.SetRect(rc);
m_player.PlayFile();
开始时是出现一个新的窗口,但是窗口显示“无法播放视频,缺少DIVS解压缩程序”,后面下载安装了DIVS后,窗口变成透明,就是一些窗口底下的其他东西,还是没有视频出来,请教各位前辈这是哪里的问题。
??播放窗口需要的是客户坐标还是屏幕坐标?
MCI_DGV_PUT_PARMS
The MCI_DGV_PUT_PARMS structure contains parameters for the MCI_PUT command for digital-video devices. typedef struct {
DWORD_PTR dwCallback;
RECT rc;
} MCI_DGV_PUT_PARMS;
MembersdwCallbackThe low-order word specifies a window handle used for the MCI_NOTIFY flag.rcRectangle containing positioning information. RECT structures are handled differently in MCI than in other parts of Windows; in MCI, rc.right contains the width of the rectangle and rc.bottom contains its height.ResWhen assigning data to the members of this structure, set the corresponding flags in the fdwCommand parameter of the mciSendCommand function to validate the members.
换成 openparms.lpstrDeviceType=TEXT("mpegvideo");
就可以 了。
现在还有一个问题,不管指定openparms.hWndParent父窗口为view窗口或者frame窗口,都会在我的窗口上面重新产生一个新的窗口来播放视频,有没有谁知道怎么指定视频在某个窗口(比如view窗口)里面播放,而不是新建一个播放窗口?期待高人?
如果分不够,我可以再加的,谢谢