代码如下:
// 打开视频文件的函数
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后,窗口变成透明,就是一些窗口底下的其他东西,还是没有视频出来,请教各位前辈这是哪里的问题。

解决方案 »

  1.   

    窗口左上角已经显示了播放视频的名称,所以文件应该正常打开了,而且所有的TRACE输出都说明这几个函数调用成功。
      

  2.   

    GetClientRect(rc);
    ??播放窗口需要的是客户坐标还是屏幕坐标?
      

  3.   

    是屏幕坐标,视频窗口已经显示出来了,只是没有视频而已,而且mciSendCommand所有函数调用都成功返回
      

  4.   

    没说是哪个坐标,估计就是整个窗口的宽高吧,相关MSDN资料如下:
    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.
      

  5.   

    我这没有实际环境和msdn,用屏幕坐标试试
      

  6.   

    试了啊,只是显示的位置不一样而已,这个视频窗口是出来的,即使我不调用SetRect设置窗口大小,它也会自己产生一个窗口,我可以加你QQ吗,这样好交流些
      

  7.   

    谢谢,大家。自己找到所在,问题解决了,原来是指定的视频类型错了,将OpenFile里面的openparms.lpstrDeviceType=TEXT("avivideo"); 
     换成 openparms.lpstrDeviceType=TEXT("mpegvideo"); 
    就可以 了。
    现在还有一个问题,不管指定openparms.hWndParent父窗口为view窗口或者frame窗口,都会在我的窗口上面重新产生一个新的窗口来播放视频,有没有谁知道怎么指定视频在某个窗口(比如view窗口)里面播放,而不是新建一个播放窗口?期待高人?
    如果分不够,我可以再加的,谢谢