WinCE5.0 下面用 DirectShow 开发的播放器,播放视频时总是新开一个窗口并且自动最小化

时间:2022-04-09 06:55:57
我先创建了一个IGraphBuilder接口,查询IVideoWindow,然后render一个文件,把IVideoWindow的owner设为一个dialog,把它的风格设为"WS_CHILD| WS_CLIPSIBLINGS",然后开始播放。

但是实际的结果是:视频播放的窗口不是我指定的dialog的子窗口。这个窗口是一个单独的一个新窗口,而且这个新窗口会自动最小化到任务栏上。

另外一个问题是,我的应用程序会重绘dialog client的rectangle,我如何才能避免重绘这个视频窗口?有什么参数可以让我设置吗(比如把这个窗口设置为always on top)

几乎相同的代码,在Windows XP下使用是正常的,在WinCE上就有这些奇怪的现象。请大牛指点。



        hr = m_pGraph->RenderFile(str_filename,NULL);
        if(FAILED(hr))
        {
                AfxMessageBox(TEXT("can not open the fail"));
                return FALSE;
        }
 
        //////////////////////////////////////////////////////////////
        // set vidio window owner and window position
        hr = m_pVidWin->put_Owner((OAHWND) (this->GetSafeHwnd()) );
        if (SUCCEEDED(hr))
        {
                // The video window must have the WS_CHILD style
                hr = m_pVidWin->put_WindowStyle( WS_POPUP | WS_BORDER  );
                if(FAILED(hr))
                {
                        AfxMessageBox(TEXT("put_WindowStyle \"WS_CHILD | WS_CLIPSIBLINGS\" fail"));
                }
                // Read coordinates of video container window
                RECT rc;
                this->GetClientRect(&rc);
                long width =  rc.right - rc.left;
                long height = rc.bottom - rc.top - 50;
 
                // Ignore the video's original size and stretch to fit bounding rectangle
                hr = m_pVidWin->SetWindowPosition(rc.left, rc.top, width, height);
                if(FAILED(hr))
                {
                        AfxMessageBox(TEXT("m_pVidWin SetWindowPosition fail"));
                        return FALSE;
                }
        } else 
        {
                AfxMessageBox(TEXT("put_Owner fail"));
                return FALSE;
        }
 
        // let window visible
        hr = m_pVidWin->put_Visible(OATRUE);
        if(FAILED(hr))
        {
                AfxMessageBox( _T("put_Visible: OATRUE fail"));
        }
        
        // start play !!!
        hr = m_pControl->Run();
        if(FAILED(hr))
        {
                CString errmsg;
                errmsg = _T("play video") + str_filename + _T("fail");
                AfxMessageBox( errmsg );
        }

6 个解决方案

#1


 hr = m_pVidWin->put_WindowStyle( WS_POPUP | WS_BORDER  );
改为
 hr = m_pVidWin->put_WindowStyle( WS_CHILD| WS_CLIPSIBLINGS );

然后就是hr = m_pVidWin->put_Owner((OAHWND) (this->GetSafeHwnd()) );
你如果想要整个对话框是播放窗口就是这样写。
如果你想要对话框上面的一个子窗口作为播放界面就应该传入子窗口的窗口句柄


 // Read coordinates of video container window
                RECT rc;
                this->GetClientRect(&rc);  //这里得到的矩形是对话框的,如果是把对话框作为播放窗口这样是对的,但是下面设置大小的时候就要改
                long width =  rc.right - rc.left;
                long height = rc.bottom - rc.top - 50;
 
                // Ignore the video's original size and stretch to fit bounding rectangle
                hr = m_pVidWin->SetWindowPosition(rc.left, rc.top, width, height);
                // hr = m_pVidWin->SetWindowPosition(0, 0, width, height); 这个是相对坐标
                if(FAILED(hr))
                {
                        AfxMessageBox(TEXT("m_pVidWin SetWindowPosition fail"));
                        return FALSE;
                }



#2


从我试的结果来看,即使设置style为WS_CHILD| WS_CLIPSIBLINGS,它还是一个单独的窗口
因为可以在taskbar看到播放窗口是个单独的任务

然后设置这个window position坐标总是绝对的(可能就是因为它并没有真的从属于某个窗口),所以如果设置0,0,X,X就回出现在窗口的最左上角

同样的程序,在windows上就是跟预期的一样(播放窗口是在dialog里的),但是wince上就总是单独的一个

顺便问问,现在我每次render文件都的重新initilize一遍IGraphBuilder接口,所以就可以在连续播放多个文件时,看到播放窗口关了又开,能不能我多创建一个IGraphBuilder,在前一个文件播放完毕的时候把它show出来,盖掉前一个,然后再把前一个播放窗口关掉,不知道这样可行不可行?有没有这样做过啊?

#3


该回复于2017-12-11 15:37:02被管理员删除

#4


LZ 你好,我现在也在做wince下用directshow的视频开发,但是我对这方面几乎什么都不懂,请问你能否发一份你的源代码借我学习一下,看在都是buaa人的关系请一定要帮我这个忙啊,非常感谢!请发到我邮箱好吗,guoyang1007@gmail.com

#5


引用楼主 landy_buaa 的回复:
我先创建了一个IGraphBuilder接口,查询IVideoWindow,然后render一个文件,把IVideoWindow的owner设为一个dialog,把它的风格设为"WS_CHILD| WS_CLIPSIBLINGS",然后开始播放。

 但是实际的结果是:视频播放的窗口不是我指定的dialog的子窗口。这个窗口是一个单独的一个新窗口,而且这个新窗口会自动最小化到任务栏上。

 另外一个问题是,我的应用程序会重绘dialog client的rectangle,我如何才能避免重绘这个视频窗口?有什么参数可以让我设置吗(比如把这个窗口设置为always on top)

 几乎相同的代码, 在Windows XP下使用是正常的,在WinCE上就有这些奇怪的现象。请大牛指点。

C/C++ code

        hr= m_pGraph->RenderFile(str_filename,NULL);if(FAILED(hr))
        {
                AfxMessageBox(TEXT("can not open the fail"));return FALSE;
        }//////////////////////////////////////////////////////////////// set vidio window owner and window position        hr= m_pVidWin->put_Owner((OAHWND) (this->GetSafeHwnd()) );if (SUCCEEDED(hr))
        {// The video window must have the WS_CHILD style                hr= m_pVidWin->put_WindowStyle( WS_POPUP| WS_BORDER  );if(FAILED(hr))
                {
                        AfxMessageBox(TEXT("put_WindowStyle \"WS_CHILD | WS_CLIPSIBLINGS\" fail"));
                }// Read coordinates of video container window                RECT rc;this->GetClientRect(&rc);long width=  rc.right- rc.left;long height= rc.bottom- rc.top-50;// Ignore the video's original size and stretch to fit bounding rectangle                hr= m_pVidWin->SetWindowPosition(rc.left, rc.top, width, height);if(FAILED(hr))
                {
                        AfxMessageBox(TEXT("m_pVidWin SetWindowPosition fail"));return FALSE;
                }
        }else 
        {
                AfxMessageBox(TEXT("put_Owner fail"));return FALSE;
        }// let window visible        hr= m_pVidWin->put_Visible(OATRUE);if(FAILED(hr))
        {
                AfxMessageBox( _T("put_Visible: OATRUE fail"));
        }// start play !!!        hr= m_pControl->Run();if(FAILED(hr))
        {
                CString errmsg;
                errmsg= _T("play video")+ str_filename+ _T("fail");
                AfxMessageBox( errmsg );
        }
原因:有些Windows XP中支持的东西,有些在WinCE下不支持。

#6


你们在挖贴~~~

#1


 hr = m_pVidWin->put_WindowStyle( WS_POPUP | WS_BORDER  );
改为
 hr = m_pVidWin->put_WindowStyle( WS_CHILD| WS_CLIPSIBLINGS );

然后就是hr = m_pVidWin->put_Owner((OAHWND) (this->GetSafeHwnd()) );
你如果想要整个对话框是播放窗口就是这样写。
如果你想要对话框上面的一个子窗口作为播放界面就应该传入子窗口的窗口句柄


 // Read coordinates of video container window
                RECT rc;
                this->GetClientRect(&rc);  //这里得到的矩形是对话框的,如果是把对话框作为播放窗口这样是对的,但是下面设置大小的时候就要改
                long width =  rc.right - rc.left;
                long height = rc.bottom - rc.top - 50;
 
                // Ignore the video's original size and stretch to fit bounding rectangle
                hr = m_pVidWin->SetWindowPosition(rc.left, rc.top, width, height);
                // hr = m_pVidWin->SetWindowPosition(0, 0, width, height); 这个是相对坐标
                if(FAILED(hr))
                {
                        AfxMessageBox(TEXT("m_pVidWin SetWindowPosition fail"));
                        return FALSE;
                }



#2


从我试的结果来看,即使设置style为WS_CHILD| WS_CLIPSIBLINGS,它还是一个单独的窗口
因为可以在taskbar看到播放窗口是个单独的任务

然后设置这个window position坐标总是绝对的(可能就是因为它并没有真的从属于某个窗口),所以如果设置0,0,X,X就回出现在窗口的最左上角

同样的程序,在windows上就是跟预期的一样(播放窗口是在dialog里的),但是wince上就总是单独的一个

顺便问问,现在我每次render文件都的重新initilize一遍IGraphBuilder接口,所以就可以在连续播放多个文件时,看到播放窗口关了又开,能不能我多创建一个IGraphBuilder,在前一个文件播放完毕的时候把它show出来,盖掉前一个,然后再把前一个播放窗口关掉,不知道这样可行不可行?有没有这样做过啊?

#3


该回复于2017-12-11 15:37:02被管理员删除

#4


LZ 你好,我现在也在做wince下用directshow的视频开发,但是我对这方面几乎什么都不懂,请问你能否发一份你的源代码借我学习一下,看在都是buaa人的关系请一定要帮我这个忙啊,非常感谢!请发到我邮箱好吗,guoyang1007@gmail.com

#5


引用楼主 landy_buaa 的回复:
我先创建了一个IGraphBuilder接口,查询IVideoWindow,然后render一个文件,把IVideoWindow的owner设为一个dialog,把它的风格设为"WS_CHILD| WS_CLIPSIBLINGS",然后开始播放。

 但是实际的结果是:视频播放的窗口不是我指定的dialog的子窗口。这个窗口是一个单独的一个新窗口,而且这个新窗口会自动最小化到任务栏上。

 另外一个问题是,我的应用程序会重绘dialog client的rectangle,我如何才能避免重绘这个视频窗口?有什么参数可以让我设置吗(比如把这个窗口设置为always on top)

 几乎相同的代码, 在Windows XP下使用是正常的,在WinCE上就有这些奇怪的现象。请大牛指点。

C/C++ code

        hr= m_pGraph->RenderFile(str_filename,NULL);if(FAILED(hr))
        {
                AfxMessageBox(TEXT("can not open the fail"));return FALSE;
        }//////////////////////////////////////////////////////////////// set vidio window owner and window position        hr= m_pVidWin->put_Owner((OAHWND) (this->GetSafeHwnd()) );if (SUCCEEDED(hr))
        {// The video window must have the WS_CHILD style                hr= m_pVidWin->put_WindowStyle( WS_POPUP| WS_BORDER  );if(FAILED(hr))
                {
                        AfxMessageBox(TEXT("put_WindowStyle \"WS_CHILD | WS_CLIPSIBLINGS\" fail"));
                }// Read coordinates of video container window                RECT rc;this->GetClientRect(&rc);long width=  rc.right- rc.left;long height= rc.bottom- rc.top-50;// Ignore the video's original size and stretch to fit bounding rectangle                hr= m_pVidWin->SetWindowPosition(rc.left, rc.top, width, height);if(FAILED(hr))
                {
                        AfxMessageBox(TEXT("m_pVidWin SetWindowPosition fail"));return FALSE;
                }
        }else 
        {
                AfxMessageBox(TEXT("put_Owner fail"));return FALSE;
        }// let window visible        hr= m_pVidWin->put_Visible(OATRUE);if(FAILED(hr))
        {
                AfxMessageBox( _T("put_Visible: OATRUE fail"));
        }// start play !!!        hr= m_pControl->Run();if(FAILED(hr))
        {
                CString errmsg;
                errmsg= _T("play video")+ str_filename+ _T("fail");
                AfxMessageBox( errmsg );
        }
原因:有些Windows XP中支持的东西,有些在WinCE下不支持。

#6


你们在挖贴~~~