D'abord, ajoutez au constructeur de votre contrôle 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;
Votre contrôle ActiveX aura une variable membre appelée m_hWnd que vous serez en mesure d'utiliser comme cible de rendu. Si la variable m_bWindowOnly est définie sur true, le contrôle ActiveX ne créera pas sa propre fenêtre.
Enfin, choisissez votre moteur de rendu (VMR9 par exemple)
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();
S'il vous plaît noter que mon objet graphique est un objet personnalisé et que GetVideoRenderer() est l'un de mes propres fonctions - il renvoie un IBaseFilter *.
Il m'a fallu longtemps pour trouver celui-ci. L'ATL est mal documenté, ce qui est dommage car c'est une excellente technologie. Quoi qu'il en soit, espérons que cela aide!