www.pudn.com > ballApp.rar > Graph.cpp
// Graph.cpp: implementation of the CGraph class. // ////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "ballApp.h" #include "Graph.h" #include "dshowutil.h" #includeDEFINE_GUID(CLSID_BouncingBall, 0xfd501041, 0x8ebe, 0x11ce, 0x81, 0x83, 0x00, 0xaa, 0x00, 0x57, 0x7d, 0xa1); #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// CGraphManager::CGraphManager() { m_pGraphBuilder = NULL; m_pVideoWindow = NULL; m_pControl = NULL; } CGraphManager::~CGraphManager() { if ( m_pControl ){ HRESULT hr ; OAFilterState state; hr = m_pControl->GetState(INFINITE,&state); if ( state == State_Running ) m_pControl->Stop(); } SAFE_RELEASE(m_pControl) SAFE_RELEASE(m_pVideoWindow) SAFE_RELEASE(m_pGraphBuilder) } BOOL CGraphManager::SetVideoWindow(HWND hWnd) { if ( (hWnd == NULL) || (!m_pVideoWindow) || (!m_pGraphBuilder) ) return FALSE; CRect rect; ::GetClientRect(hWnd, &rect); m_pVideoWindow->put_Visible(OAFALSE); m_pVideoWindow->put_Owner((OAHWND)hWnd); m_pVideoWindow->put_WindowStyle(WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN); m_pVideoWindow->SetWindowPosition(rect.left, rect.top, rect.Width(), rect.Height()); m_pVideoWindow->put_MessageDrain((OAHWND)hWnd); m_pVideoWindow->put_Visible(OATRUE); return TRUE; } BOOL CGraphManager::Run() { if ( !m_pControl ) return FALSE; HRESULT hr = m_pControl->Run(); if ( SUCCEEDED(hr) ) return TRUE; else return FALSE; } void CGraphManager::Stop() { if ( m_pControl ) m_pControl->Stop(); } void CGraphManager::Pause() { if ( m_pControl ) m_pControl->Pause(); } BOOL CGraphManager::Create() { HRESULT hr = 0; hr |= CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC, IID_IGraphBuilder, (void**)&m_pGraphBuilder); if ( !QueryInterfaces() ) return FALSE; IBaseFilter *pFilter = NULL; hr |= CoCreateInstance(CLSID_BouncingBall, NULL, CLSCTX_INPROC, IID_IBaseFilter, (void**)&pFilter); hr |= m_pGraphBuilder->AddFilter(pFilter,L"source filter"); IBaseFilter * pRender = NULL; hr |= CoCreateInstance(CLSID_VideoRenderer, NULL, CLSCTX_INPROC, IID_IBaseFilter, (void**)&pRender); hr |= m_pGraphBuilder->AddFilter(pRender,L"renderer filter"); IPin * pOut = NULL, *pIn = NULL; pOut = GetOutPin(pFilter, 0); pIn = GetInPin(pRender, 0); hr |= m_pGraphBuilder->Connect(pOut,pIn); pFilter->Release(); pRender->Release(); if ( SUCCEEDED(hr) ) return TRUE; return FALSE; } BOOL CGraphManager::QueryInterfaces() { if ( !m_pGraphBuilder ) return FALSE; HRESULT hr = 0; hr |= m_pGraphBuilder->QueryInterface(IID_IMediaControl, (void**)&m_pControl); hr |= m_pGraphBuilder->QueryInterface(IID_IVideoWindow, (void**)&m_pVideoWindow); if ( SUCCEEDED(hr) ) return TRUE; return FALSE; }