2010-10-05 27 views
2

Je voudrais rendre la vidéo dans le contrôle ActiveX (pas dans la fenêtre Pop-up DirectShow). J'ai:ActiveX HWND, mode DirectX WindowLess

IID_IVMRWindowlessControl 
IID_IVMRFilterConfig9 
CLSID_VideoMixingRenderer9 

Je voudrais définir le mode Windowless, mais je ne sais pas comment HWND de ..., exactement, de quoi? IEFrame, élément HTML?

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

Quelqu'un avec un indice?

Cordialement.

Répondre

1

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!

0

L'information de freefallr est extrêmement utile, mais je ne pense pas qu'elle réponde complètement à votre question. L'astuce avec les contrôles ActiveX sans fenêtre est que vous n'avez pas obtenir une fenêtre. Lorsque vous dessinez, vous obtenez simplement un contexte de périphérique et vous devez répondre à l'appel du navigateur et dessiner seulement quand il vous le demande.

Les interfaces requises sont ici: http://msdn.microsoft.com/en-us/library/ms682300%28v=VS.85%29.aspx

plus d'info ici: http://msdn.microsoft.com/en-us/library/aa751970%28VS.85%29.aspx#OC96_and_Windowless_

Nous avons eu l'intention d'ajouter le support pour cela dans Firebreath (http://firebreath.org) pendant un certain temps; Nous avons un support pour tous les navigateurs npapi, mais il semble que nous ne prenons pas (encore) en charge IE. Si vous trouvez plus de détails, postez un résumé ici =]