2010-11-02 2 views
0

Я построил класс C# COM, который работает в приложении для родных окон (MFC C++). Класс COM используется для отображения видео на дескрипторе окна из основного приложения. Я использую .NET interop для доступа к DirectShow в моем приложении C#. После того, как я создаю график, я вижу, что окно ActiveMovie появляется, прежде чем оно будет правильно помещено в окно.Окно видео DirectShow появляется при воспроизведении видеофайла

Вот пример того, как я настраиваю свой график. Я не включил весь код, но я думаю, что важная часть включена - рендеринг графика и настройка владельца окна и позиции.

 _graphBuilder = (IGraphBuilder)new FilgraphManager(); 

     _sourceFilter = (IBaseFilter)Activator.CreateInstance(Type.GetTypeFromCLSID(CLSID.AsyncReader)); 
     hr = ((IFileSourceFilter)_sourceFilter).Load(fileName, null); 
     DSUtilities.ThrowExceptionForHR(hr); 
     hr = _graphBuilder.AddFilter(_sourceFilter, "AsyncReader"); 
     DSUtilities.ThrowExceptionForHR(hr); 

     IPin output = DSUtilities.FindPinByDirection(_sourceFilter, _PinDirection.PINDIR_OUTPUT, 0); 

     // add some other filters 
     // ... 

     _graphBuilder.Render(output); 
     _videoWindow = (IVideoWindow)_graphBuilder; 

     _videoWindow.WindowStyle = (int)(WindowStyle.Child | WindowStyle.ClipChildren); 
     _videoWindow.SetWindowPosition(_viewer.VideoRectangle.Left, _viewer.VideoRectangle.Top, _viewer.VideoRectangle.Width, _viewer.VideoRectangle.Height); 
     _videoWindow.Owner = viewer.CanvasHandle.ToInt32(); 

Я считаю, что эта проблема связана либо с вызовом _graphBuilder.Render() или настройки владельца окна и окна позиции. Я перепутал с порядком вызовов функций, и ничего не помогает. Важно отметить, что вы не можете захватить интерфейс IVideoWindow до тех пор, пока вы не вызовете Render() на IGraphBuilder. Мне нужно избавиться от всплывающих окон! Кто-нибудь еще видел эту проблему? Или у кого-нибудь есть идеи о том, что вызывает это? Любая помощь будет оценена.

Спасибо, Dan

ответ

0

Эта последовательность вызовов работает для меня, не выскакивать окно:

pGraph->RenderFile(fname, NULL); 
pGraph->QueryInterface(IID_IVideoWindow, (void**) &pVidWindow); 

pVidWindow->put_Owner((OAHWND)hwnd); 
pVidWindow->put_WindowStyle(WS_CHILD | WS_CLIPSIBLINGS); 
pVidWindow->SetWindowPosition(0, 0, grc.right, grc.bottom); 
pVidWindow->put_MessageDrain((OAHWND)hwnd); 
pVidWindow->put_Visible(OATRUE);