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" 
#include  
DEFINE_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; 
}