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

Landy_BUAA 2009-04-08 09:45:28
我先创建了一个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 );
}
...全文
1374 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
liangxd09 2011-02-16
  • 打赏
  • 举报
回复
你们在挖贴~~~
wolfmvp 2010-02-02
  • 打赏
  • 举报
回复
[Quote=引用楼主 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 );
}
[/Quote]原因:有些Windows XP中支持的东西,有些在WinCE下不支持。
guoyang1007 2010-02-01
  • 打赏
  • 举报
回复
LZ 你好,我现在也在做wince下用directshow的视频开发,但是我对这方面几乎什么都不懂,请问你能否发一份你的源代码借我学习一下,看在都是buaa人的关系请一定要帮我这个忙啊,非常感谢!请发到我邮箱好吗,guoyang1007@gmail.com
laitoutu 2009-04-09
  • 打赏
  • 举报
回复
从我试的结果来看,即使设置style为WS_CHILD| WS_CLIPSIBLINGS,它还是一个单独的窗口
因为可以在taskbar看到播放窗口是个单独的任务

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

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

顺便问问,现在我每次render文件都的重新initilize一遍IGraphBuilder接口,所以就可以在连续播放多个文件时,看到播放窗口关了又开,能不能我多创建一个IGraphBuilder,在前一个文件播放完毕的时候把它show出来,盖掉前一个,然后再把前一个播放窗口关掉,不知道这样可行不可行?有没有这样做过啊?
jinlking 2009-04-09
  • 打赏
  • 举报
回复
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;
}



19,502

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧