Прежде всего, добавьте это в конструктор вашего элемента управления 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 плохо документирован, что обидно, потому что это отличная технология. В любом случае, надеюсь, это поможет!