我想在ActiveX控件中呈现视频(而不是在弹出的DirectShow窗口中)。我有:
IID_IVMRWindowlessControl
IID_IVMRFilterConfig9
CLSID_VideoMixingRenderer9
我想设置WindowLess模式,但我不知道如何获得......的确切的HWND ... IEFrame,HTML元素?
hr = pWc->SetVideoClippingWindow(???);
任何有暗示的人?
问候。
答案 0 :(得分:1)
首先,将其添加到ActiveX控件的构造函数中:
// this seemingly innocent line is _extremely_ important.
// This causes the window for the control to be created
// otherwise, you won't get an hWnd to render to!
m_bWindowOnly = true;
您的ActiveX控件将有一个名为m_hWnd的成员变量,您可以将其用作渲染目标。如果没有将m_bWindowOnly变量设置为true,则ActiveX控件将不会创建自己的窗口。
最后,选择你的渲染器(例如VMR9)
CRect rcClient;
CComPtr<IBaseFilter> spRenderer;
CComPtr<IVMRWindowlessControl9> spWindowless;
// Get the client window size
::GetClientRect(m_hWnd, rcClient);
// Get the renderer filter
spRenderer.Attach( m_pGraph->GetVideoRenderer() );
if( ! spRenderer )
return E_POINTER;
spWindowless = spRenderer;
if( spWindowless )
{
spWindowless->SetVideoClippingWindow( m_hWnd );
spWindowless->SetVideoPosition(NULL, rcClient);
spWindowless.Release();
}
spRenderer.Detach();
请注意我的图形对象是一个自定义对象,而GetVideoRenderer()是我自己的函数之一 - 它返回一个IBaseFilter *。
我花了很长时间才找到这个。 ATL记录很少,这是一种耻辱,因为它是一种出色的技术。无论如何,希望这有帮助!
答案 1 :(得分:0)
freefallr的信息非常有用,但我不认为它完全回答了你的问题。无窗口activex控件的技巧是你不获取窗口。当你绘制时,你只需要获得一个设备上下文,你必须回复来自浏览器的调用,只有在它告诉你的时候画画。
所需的接口位于:http://msdn.microsoft.com/en-us/library/ms682300%28v=VS.85%29.aspx
此处有更多信息:http://msdn.microsoft.com/en-us/library/aa751970%28VS.85%29.aspx#OC96_and_Windowless_
我们一直想在FireBreath(http://firebreath.org)中添加对此的支持一段时间;我们在所有npapi浏览器中都支持它,但看起来我们还没有(还)支持IE。如果您找到更多详细信息,请在此处发布摘要=]