Am Playing the video by creating the filter graph using directshow in MFC. If i press the control which is in the parent dialog box i need to play the video in parent dialog box as well as child dialog box. The video was played in parent dialog box, to play as well as in child window what i have to do.
Here is my code:
CplaybackControls1Dlg::CplaybackControls1Dlg(CWnd* pParent )
: CDialog(CplaybackControls1Dlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
z=new CZoom;
}
BOOL CplaybackControls1Dlg::OnInitDialog()
{
CDialog::OnInitDialog();
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
SetIcon(m_hIcon, TRUE); SetIcon(m_hIcon, FALSE); hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
IID_IGraphBuilder, (void **)&pGraph);
if (FAILED(hr))
{
MessageBox(L"ERROR - Could not create the Filter Graph Manager.");
return FALSE;
}
hr = pGraph->QueryInterface(IID_IMediaControl, (void **)&pControl);
hr = pGraph->QueryInterface(IID_IMediaEvent, (void **)&pEvent);
IMediaEventEx *g_pEvent = NULL;
pGraph->QueryInterface(IID_IMediaEventEx, (void **)&pEvent);
hr = InitWindowlessVMR(AfxGetMainWnd()->m_hWnd, pGraph, &pWc);
hr=pGraph->RenderFile(L"C:\\Documents and Settings\\BTC\\Desktop\\hai.mp4", NULL);
VideoSize();
return TRUE; }
void CplaybackControls1Dlg::OnBnClickedPlayButton()
{
hr = pEvent->SetNotifyWindow((OAHWND)AfxGetMainWnd()->m_hWnd, WM_GRAPHNOTIFY, 0);
if (SUCCEEDED(hr))
{
hr = pControl->Run();
z->ShowWindow(SW_SHOW);
}
}
HRESULT CplaybackControls1Dlg::InitWindowlessVMR(
HWND hwndApp, IGraphBuilder* pGraph, IVMRWindowlessControl** ppWc )
{
if (!pGraph || !ppWc)
{
return E_POINTER;
}
IBaseFilter* pVmr = NULL;
IVMRWindowlessControl* pWc = NULL;
HRESULT hr = CoCreateInstance(CLSID_VideoMixingRenderer, NULL,
CLSCTX_INPROC, IID_IBaseFilter, (void**)&pVmr);
if (FAILED(hr))
{
return hr;
}
hr = pGraph->AddFilter(pVmr, L"Video Mixing Renderer");
if (FAILED(hr))
{
pVmr->Release();
return hr;
}
IVMRFilterConfig* pConfig;
hr = pVmr->QueryInterface(IID_IVMRFilterConfig, (void**)&pConfig);
if (SUCCEEDED(hr))
{
hr = pConfig->SetRenderingMode(VMRMode_Windowless);
pConfig->Release();
}
if (SUCCEEDED(hr))
{
hr = pVmr->QueryInterface(IID_IVMRWindowlessControl, (void**)&pWc);
if( SUCCEEDED(hr))
{
hr = pWc->SetVideoClippingWindow(hwndApp);
if (SUCCEEDED(hr))
{
*ppWc = pWc; }
else
{
pWc->Release();
}
}
}
pVmr->Release();
return hr;
}
int CplaybackControls1Dlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CDialog::OnCreate(lpCreateStruct) == -1)
return -1;
z->Create(IDD_DIALOG1,this);
z->ShowWindow(FALSE);
return 0;
}
LRESULT CplaybackControls1Dlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case WM_GRAPHNOTIFY:
HandleGraphEvent();
break;
case WM_CLOSE:
CleanUp();
break;
}
return CDialog::WindowProc(message, wParam, lParam);
}
void CplaybackControls1Dlg::HandleGraphEvent()
{
if (pEvent == NULL)
{
return;
}
long evCode;
LONG_PTR param1, param2;
while (SUCCEEDED(pEvent->GetEvent(&evCode, ¶m1, ¶m2, 0)))
{
pEvent->FreeEventParams(evCode, param1, param2);
switch (evCode)
{
case EC_COMPLETE: case EC_USERABORT: case EC_ERRORABORT:
pControl->Stop();
pEvent->SetNotifyWindow(NULL, 0, 0);
return;
}
}
}
void CplaybackControls1Dlg::CleanUp()
{
pWc->Release();
pControl->Release();
pGraph->Release();
pEvent->Release();
}
void CplaybackControls1Dlg::VideoSize()
{
long lWidth, lHeight;
hr = pWc->GetNativeVideoSize(&lWidth, &lHeight, NULL, NULL);
if (SUCCEEDED(hr))
{
RECT rcSrc, rcDest;
SetRect(&rcSrc, 0, 0, lWidth, lHeight);
GetClientRect(&rcDest);
SetRect(&rcDest, 0, 40, rcDest.right, rcDest.bottom);
hr = pWc->SetVideoPosition(&rcSrc, &rcDest);
}
}
CZoom is the child window.
This code is for playing the video in the parent window. What changes i have to make to play the video in the child.
Thank You in advance,