您的位置:首页 > 其它

一个不得不记的问题

2007-04-23 22:20 211 查看
被这个问题困扰了两天了,好不爽,于是记下来,希望如果有人遇到同样问题,不要再受吃苦,顺便鄙视微软一下。
问题是这样的,由于种种迫不得已的原因,用vs2003+direcshow做了个支持视频点播,在线视频播放,摄像头视频捕捉的小程序,设置void Cvp::DisplayVideoWin()
{
CRect rc;
if(m_pWin)
{
m_pWin->put_Owner((OAHWND)m_hWnd);
m_pWin->put_WindowStyle(WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN);
::GetClientRect(m_hWnd,&rc);
m_pWin->SetWindowPosition(rc.left, rc.top, rc.Width(), rc.Height());
m_pWin->put_Visible(OATRUE);
}
}

在播放本地视频时能显示,但播放点播文件时却不能显示,百思不得其解,于是百度一下,找到了 http://topic.csdn.net/t/20050418/10/3944903.html (这里顺便纠正下这位大哥的一点看法,经过我的试验,拖动窗口是不会发出WM_PAINR消息的)启发之下,便在play按钮事件末尾加了:
Sleep(1500);
CRect rc;
::GetWindowRect(m_hWnd,&rc);
MoveWindow(rc.left,rc.top,rc.Width(),rc.Height());
发现播放mpeg(是mpeg1格式的)文件时,有了短暂的显示,喜。但后来播放avi格式的时候,发现不加这一句,便可显示出来,原来问题根本不在程序本身,一切只是mpeg格式文件给我们造成的假象。也就是说我们本来是没错的,错的是微软!这是他们的一个bug而已。所谓的Sleep(30),或Sleep(1500),只不过是给咱们的反映时间而已,
就像开始没有加上面这四句,窗口只是闪一下。
这个程序结束后,我将彻底转投linux门下,与emacs为伴了。一定要好好学习,将来用自己写的包,靠别人的包为生,真是死都不知道怎么死的!

被这个问题困扰了两天了,好不爽,于是记下来,希望如果有人遇到同样问题,不要再受吃苦,顺便鄙视微软一下。
问题是这样的,由于种种迫不得已的原因,用vs2003+direcshow做了个支持视频点播,在线视频播放,摄像头视频捕捉的小程序,设置void Cvp::DisplayVideoWin()
{
CRect rc;
if(m_pWin)
{
m_pWin->put_Owner((OAHWND)m_hWnd);
m_pWin->put_WindowStyle(WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN);
::GetClientRect(m_hWnd,&rc);
m_pWin->SetWindowPosition(rc.left, rc.top, rc.Width(), rc.Height());
m_pWin->put_Visible(OATRUE);
}
}
播放本地文件时可以显示窗口,但播放点播文件时却不能。百思不得其解,于是百度了一下,找到
http://topic.csdn.net/t/20050418/10/3944903.html (这里顺便纠正下这位大哥的一点看法,经过本人试验,拖动窗口是不会引发WM_PAINT消息的),启发之下,便在play按钮事件末尾加了:
Sleep(1500);
CRect rc;
::GetWindowRect(m_hWnd,&rc);
MoveWindow(rc.left,rc.top,rc.Width(),rc.Height());
发现播放mpeg(是mpeg1格式的)文件时,有了短暂的显示,喜。但后来播放avi格式的时候,发现不加这一句,便可显示出来,原来问题根本不在程序本身,一切只是mpeg格式文件给我们造成的假象。也就是说我们本来是没错的,错的是微软!这是他们的一个bug而已。所谓的Sleep(30),或Sleep(1500),只不过是给咱们的反映时间而已,
就像开始没有加上面这四句,窗口只是闪一下。

这个程序结束后,我将彻底转投linux门下,与emacs为伴了。一定要好好学习,将来用自己写的包,靠别人的包为生,真是死都不知道怎么死的!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: