ActiveX HWND,DirectX WindowLess模式

时间:2010-10-05 16:23:45

标签: c++ activex directx directshow directdraw

我想在ActiveX控件中呈现视频(而不是在弹出的DirectShow窗口中)。我有:

IID_IVMRWindowlessControl
IID_IVMRFilterConfig9
CLSID_VideoMixingRenderer9

我想设置WindowLess模式,但我不知道如何获得......的确切的HWND ... IEFrame,HTML元素?

hr = pWc->SetVideoClippingWindow(???); 

任何有暗示的人?

问候。

2 个答案:

答案 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。如果您找到更多详细信息,请在此处发布摘要=]