ActiveX HWND, режим DirectX WindowLess - PullRequest
2 голосов
/ 05 октября 2010

Я хотел бы отобразить видео в элементе управления ActiveX (не во всплывающем окне DirectShow). У меня есть:

IID_IVMRWindowlessControl
IID_IVMRFilterConfig9
CLSID_VideoMixingRenderer9

Я бы хотел установить режим WindowLess, но я не знаю, как получить HWND из ... точно, чего? IEFrame, элемент HTML?

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

Кто-нибудь с некоторым намеком?

Привет.

Ответы [ 2 ]

1 голос
/ 13 октября 2010

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

0 голосов
/ 06 ноября 2010

Информация о 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. Если вы найдете более подробную информацию , оставьте резюме здесь =]

...