【VC开源代码栏目提醒】:本文主要为网学会员提供DirectShowEventDlg.cpp,希望对需要DirectShowEventDlg.cpp网友有所帮助,学习一下!
// DirectShowEventDlg.cpp : implementation file
//
#include "stdafx.h"
#include "MediaPlayer.h"
#include "DirectShowEventDlg.h"
#include "VideoSet.h"
#include <dshow.h>
#include "Mpconfig.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDirectShowEventDlg dialog
DWORD WINAPI ThreadProc(LPVOID lpParameter )
{
CDirectShowEventDlg* pWnd = (CDirectShowEventDlg*)lpParameter;
HANDLE hEvent;
pWnd->pEvent->GetEventHandle( (OAEVENT*) &hEvent);
long code,p1,p2;
BOOL done = FALSE;
while (!done)
{
pWnd->SendMessage(CM_POSCHANGE);
if (WaitForSingleObject(hEvent,80)==WAIT_OBJECT_0)
{
while (SUCCEEDED( pWnd->pEvent->GetEvent(&code,&p1,&p2,0)))
{
pWnd->pEvent->FreeEventParams(code,p1,p2);
if (code==EC_COMPLETE)
{
pWnd->m_Completed = TRUE;
pWnd->SendMessage(CM_COMPLETE);
done=true;
}
}
}
}
return 0 ;
}
CDirectShowEventDlg::CDirectShowEventDlg(CWnd* pParent /*=NULL*/)
: CDialog(CDirectShowEventDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CDirectShowEventDlg)
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDI_ICON1);
m_bFullScreen = FALSE;
pViewWnd = NULL;
pBaseVideo = NULL;
pBase = NULL;
m_lVolumn = 0;
m_bMute = FALSE;
m_bSpeed = FALSE;
m_bBack= FALSE;
m_bGrayImage = FALSE;
m_fSaturation = m_fBright = m_fContrast = m_fHue = 1;
pRender = NULL;
pMediaControl = NULL;
m_bStop = m_bPause = FALSE;
pGraph = NULL;
m_hThread = NULL;
m_bViewPlay = FALSE;
m_bInvalidFile = FALSE;
m_Completed = TRUE;
pEvent = NULL;
}
void CDirectShowEventDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CDirectShowEventDlg)
DDX_Control(pDX, IDC_CTLLIST, m_CtlList);
DDX_Control(pDX, IDC_GROUPPOS, m_GroupPos);
DDX_Control(pDX, IDC_CURPOS, m_CurPos);
DDX_Control(pDX, IDC_PROCESS, m_Progress);
DDX_Control(pDX, IDC_TB_STOP, m_Stop);
DDX_Control(pDX, IDC_TB_PAUSE, m_Pause);
DDX_Control(pDX, IDC_GRAY, m_GrayBtn);
DDX_Control(pDX, IDC_PROCESSCTRL, m_ProgressCtrl);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CDirectShowEventDlg, CDialog)
//{{AFX_MSG_MAP(CDirectShowEventDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_SETFILE, OnSetFile)
ON_BN_CLICKED(IDC_SNAP, OnSnap)
ON_BN_CLICKED(IDC_FULLSCREEN, OnFullScreen)
ON_BN_CLICKED(IDC_MUTE, OnMute)
ON_BN_CLICKED(IDC_VOLUMNMAX, OnVolumnmax)
ON_BN_CLICKED(IDC_VOLUMNMIN, OnVolumnmin)
ON_BN_CLICKED(IDC_ADDSPEED, OnAddSpeed)
ON_BN_CLICKED(IDC_ADDBACK, OnAddBack)
ON_BN_CLICKED(IDC_GRAY, OnGray)
ON_WM_TIMER()
ON_BN_CLICKED(IDC_VIDEOSET, OnVideoset)
ON_WM_HSCROLL()
ON_BN_CLICKED(IDC_TB_PAUSE, OnTbPause)
ON_BN_CLICKED(IDC_TB_STOP, OnTbStop)
ON_BN_CLICKED(IDC_SHOWWND, OnShowwnd)
ON_MESSAGE(CM_COMPLETE,Done)
//}}AFX_MSG_MAP
ON_MESSAGE(CM_POSCHANGE,OnPosChange)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDirectShowEventDlg message handlers
DWORD WINAPI PlayVideoFile(LPVOID lpParameter )
{
CDirectShowEventDlg* pWnd = (CDirectShowEventDlg*)lpParameter;
CString strFile= pWnd->m_FileName;
HRESULT hRet = pWnd->pGraph->RenderFile(strFile.AllocSysString(),NULL);
if(hRet!=S_OK)
{
pWnd->m_bInvalidFile = TRUE; //非法的文件
return 1;
}
//获取VideoRender filter
pWnd->pBase == NULL;
IBaseFilter *pRenderFiler = NULL;
pWnd->pGraph->FindFilterByName(L"Video Renderer",(IBaseFilter**)&pRenderFiler);
if (pRenderFiler!=NULL) //包含视频信息
{
pWnd->m_bViewPlay = TRUE;
IPin* pVideoIn = NULL;
pVideoIn = pWnd->FindPin(pRenderFiler,PINDIR_INPUT);
if (pVideoIn)
{
pVideoIn->Disconnect();
}
pWnd->pGraph->RemoveFilter(pRenderFiler);
pWnd->pGraph->AddFilter(pWnd->pRender,L"Render");
//获取视频解码器
pWnd->pGraph->FindFilterByName(L"MPEG Video Decoder",(IBaseFilter**)&pWnd->pBase);
if (pWnd->pBase)
{
IPin* pOutPin = NULL;
//获取视频解码的输出引脚
pOutPin = pWnd->FindPin(pWnd->pBase,PINDIR_OUTPUT);
if (pOutPin != NULL)
{
IPin* pColorIn = NULL;
IPin* pColorOut = NULL;
//获取输入和输出引脚
IPin *pTextIn = NULL;
IPin *pTextOut = NULL;
IPin *pRenderIn = NULL;
pRenderIn = pWnd->FindPin(pWnd->pRender,PINDIR_INPUT);
HRESULT hRet = 0;
hRet = pOutPin->Disconnect();
hRet = pWnd->pGraph->ConnectDirect(pOutPin,pRenderIn,NULL);
}
}
}
else
{
pWnd->m_bViewPlay = FALSE; //没有视频信息
}
pWnd->m_ThreadStop = TRUE;
return 0 ;
}
BOOL CDirectShowEventDlg::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);
m_Completed = FALSE;
m_Previewed = FALSE;
m_hThread = NULL;
m_DisplayWnd.Create(IDD_DISPLAYWND_DIALOG);
m_DisplayWnd.GetWindowRect(m_OriginRC);
SetTimer(1,100,NULL);
return TRUE;
}
void CDirectShowEventDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
// If you add a minimize button to your dialog, you will need the code be
上一篇:
bjUnit.pas
下一篇:
贪心算法论文终稿