⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 videoplaydlg.cpp

📁 一个在WINCE5.0下开发的MP4播放器,可以播放多种视频文件,画面优质.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// VideoPlayDlg.cpp : implementation file
//

#include "stdafx.h"
#include "VideoPlay.h"
#include "VideoPlayDlg.h"
#include "FileListDlg.h"
#include "Coordinate.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

extern CStringList	g_StrList;
int			g_nCurSelItem = 0;

typedef enum {
	VIDEO_CTRL_CLOSE,
	VIDEO_CTRL_PLAY,
	VIDEO_CTRL_STOP,
	VIDEO_CTRL_BACKWARD,
	VIDEO_CTRL_FORWARD,
	VIDEO_CTRL_OPEN,
	VIDEO_CTRL_FULLSCREEN,
	VIDEO_CTRL_VOLUME,
	VIDEO_CTRL_PROSLIDER,
	VIDEO_CTRL_VOLSLIDER,
	VIDEO_CTRL_COUNT,
}VIDEOCTRL;

POINT VideoBtnPos[VIDEO_CTRL_COUNT] ={
	{CLOSE_BTN_X, CLOSE_BTN_Y},			//close
	{PLAY_BTN_X, PLAY_BTN_Y},			//play
	{STOP_BTN_X, STOP_BTN_Y},			//stop
	{BACKWARD_BTN_X, BACKWARD_BTN_Y},	//backward
	{FORWARD_BTN_X, FORWARD_BTN_Y},		//forward
	{OPEN_BTN_X, OPEN_BTN_Y},			//open
	{FULLSCREEN_BTN_X, FULLSCREEN_BTN_Y},			//fullscrenn
	{VOL_BTN_X, VOL_BTN_Y},				//volume
	{PRO_SLIDE_X, PRO_SLIDE_Y},			//program slide
	{VOL_SLIDE_X, VOL_SLIDE_Y}			//volume slide
};

CRect RectVideoTitle(VIDEO_TITLE_LEFT, VIDEO_TITLE_TOP, VIDEO_TITLE_RIGHT, VIDEO_TITLE_BOTTOM);
CRect RectVideoTime(TIME_LEFT, TIME_TOP, TIME_RIGHT, TIME_BOTTOM);
CRect RectVideoPlay(VIDEO_PLAY_LEFT, VIDEO_PLAY_TOP, VIDEO_PLAY_RIGHT, VIDEO_PLAY_BOTTOM);

void IncreaseVolume();
void DecreaseVolume();

/////////////////////////////////////////////////////////////////////////////
// CVideoPlayDlg dialog

CVideoPlayDlg::CVideoPlayDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CVideoPlayDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CVideoPlayDlg)
	//}}AFX_DATA_INIT

	memset(m_chFileName,0,sizeof(TCHAR)*MAX_STRING);
	//init variable
	m_bMute = FALSE;
	m_nVolume = VOL_DEFAULT;

	m_nTimeHour = 0;
	m_nTimeMin = 0;
	m_nTimeSec = 0;	
}

void CVideoPlayDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CVideoPlayDlg)
	DDX_Control(pDX, IDC_SLIDER_VOL, m_sliderVol);
	DDX_Control(pDX, IDC_SLIDER_PRO, m_sliderPro);
	DDX_Control(pDX, IDC_STATIC_TITLE, m_Title);
	DDX_Control(pDX, IDC_STATIC_TIME, m_Time);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CVideoPlayDlg, CDialog)
	//{{AFX_MSG_MAP(CVideoPlayDlg)
	ON_WM_PAINT()
	ON_WM_ERASEBKGND()
	ON_BN_CLICKED(IDC_CLOSE, OnClose)
	ON_BN_CLICKED(IDC_PLAY, OnPlay)
	ON_BN_CLICKED(IDC_STOP, OnStop)
	ON_BN_CLICKED(IDC_PAUSE, OnPause)
	ON_BN_CLICKED(IDC_MUTE, OnMute)
	ON_BN_CLICKED(IDC_VOL, OnVol)
	ON_BN_CLICKED(IDC_OPEN, OnOpenFile)
	ON_BN_CLICKED(IDC_FORWARD, OnNextFile)
	ON_BN_CLICKED(IDC_BACKWARD, OnLastFile)
	ON_WM_CTLCOLOR()
	ON_WM_TIMER()
	ON_WM_LBUTTONDOWN()
	//}}AFX_MSG_MAP
	ON_MESSAGE(WM_BITMAPSLIDER_MOVED, OnBitmapSliderMoved)
	ON_MESSAGE(WM_BITMAPSLIDER_MOVING, OnBitmapSliderMoving)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CVideoPlayDlg message handlers

BOOL CVideoPlayDlg::OnInitDialog()
{
	CDialog::OnInitDialog();
	
	SetWindowPos(NULL, VIDEO_LEFT, VIDEO_TOP, VIDEO_WIDTH, VIDEO_HEIGHT, SWP_SHOWWINDOW);

// 	ModifyStyle(WS_CAPTION,NULL,SWP_DRAWFRAME);
// 	ModifyStyleEx(WS_EX_DLGMODALFRAME,NULL,SWP_DRAWFRAME);

	//load bk bitmap
#ifdef SCREEN_320X240
	m_BMPBG.LoadBitmap(IDB_BACKGROUND320);
#else
	m_BMPBG.LoadBitmap(IDB_BACKGROUND480);
#endif

	LoadAndLocateButtons();

	//add battery
	VERIFY(m_bat.Create(NULL, WS_VISIBLE|WS_CHILD|SS_BITMAP, CRect(412,256,436,266), this));
	RegisterBatteryWndToMainUI(m_bat.GetSafeHwnd());

	m_Time.MoveWindow(&RectVideoTime);
	m_Title.MoveWindow(&RectVideoTitle);

	//slider program
	m_sliderPro.SetBitmapChannel(IDB_PROSLIDE_ACTIVE, IDB_PROSLIDER);
//	m_sliderPro.SetBitmapThumb( IDB_PRO_THUMB_A, IDB_PRO_THUMB_B, TRUE );
	m_sliderPro.DrawFocusRect( FALSE );
	m_nMin = 0;
	m_nMax = m_nProWidth;
	m_nPos = 0;
	
	m_sliderPro.SetRange( m_nMin, m_nMax );
	m_sliderPro.SetPos( m_nPos );

//	m_sliderPro.SetMargin( 0, 2, 0, 0 );
	//slider volume

	m_sliderVol.SetBitmapChannel( IDB_VOL_OFF, IDB_VOL_ON, TRUE );
	m_sliderVol.SetRange( 0, m_nVolWidth);
	m_sliderVol.SetMarginLeft( 2 );
	m_sliderVol.SetMarginRight( 2 );
	//set position	
//  	double dd = (double)m_nVolume/VOL_SILENCE;
// 	int i = dd*m_nVolWidth;
	m_sliderVol.SetPos((int)(((double)m_nVolume/VOL_SILENCE)*m_nVolWidth));

	m_fullScreen = FALSE;
	//initialize video play window
	m_videoWindow.left   = VIDEO_PLAY_LEFT;	
	m_videoWindow.top    = VIDEO_PLAY_TOP;	
	m_videoWindow.right  = VIDEO_PLAY_RIGHT;
	m_videoWindow.bottom = VIDEO_PLAY_BOTTOM;
	// TODO: Add extra initialization here

	return TRUE;  // return TRUE  unless you set the focus to a control
}
void CVideoPlayDlg::LoadAndLocateButtons()
{
	CRect btnRect;

	VERIFY(m_btnClose.AutoLoad(IDC_CLOSE, this));
	m_btnClose.GetClientRect(&btnRect);
	m_btnClose.MoveWindow(VideoBtnPos[VIDEO_CTRL_CLOSE].x, VideoBtnPos[VIDEO_CTRL_CLOSE].y, btnRect.Width(), btnRect.Height(), FALSE);

	VERIFY(m_btnPlay.AutoLoad(IDC_PLAY, this));
	m_btnPlay.GetClientRect(&btnRect);
	m_btnPlay.MoveWindow(VideoBtnPos[VIDEO_CTRL_PLAY].x, VideoBtnPos[VIDEO_CTRL_PLAY].y, btnRect.Width(), btnRect.Height(), FALSE);

  	VERIFY(m_btnPause.AutoLoad(IDC_PAUSE, this));
  	m_btnPause.GetClientRect(&btnRect);
  	m_btnPause.MoveWindow(VideoBtnPos[VIDEO_CTRL_PLAY].x, VideoBtnPos[VIDEO_CTRL_PLAY].y, btnRect.Width(), btnRect.Height(), FALSE);
	m_btnPause.ShowWindow(SW_HIDE);

	VERIFY(m_btnStop.AutoLoad(IDC_STOP, this));
	m_btnStop.GetClientRect(&btnRect);
	m_btnStop.MoveWindow(VideoBtnPos[VIDEO_CTRL_STOP].x, VideoBtnPos[VIDEO_CTRL_STOP].y, btnRect.Width(), btnRect.Height(), FALSE);

	VERIFY(m_btnBackward.AutoLoad(IDC_BACKWARD, this));
	m_btnBackward.GetClientRect(&btnRect);
	m_btnBackward.MoveWindow(VideoBtnPos[VIDEO_CTRL_BACKWARD].x, VideoBtnPos[VIDEO_CTRL_BACKWARD].y, btnRect.Width(), btnRect.Height(), FALSE);

	VERIFY(m_btnForward.AutoLoad(IDC_FORWARD, this));
	m_btnForward.GetClientRect(&btnRect);
	m_btnForward.MoveWindow(VideoBtnPos[VIDEO_CTRL_FORWARD].x, VideoBtnPos[VIDEO_CTRL_FORWARD].y, btnRect.Width(), btnRect.Height(), FALSE);

	VERIFY(m_btnOpen.AutoLoad(IDC_OPEN, this));
	m_btnOpen.GetClientRect(&btnRect);
	m_btnOpen.MoveWindow(VideoBtnPos[VIDEO_CTRL_OPEN].x, VideoBtnPos[VIDEO_CTRL_OPEN].y, btnRect.Width(), btnRect.Height(), FALSE);

	//program slide 
	m_sliderPro.GetClientRect(&btnRect);
	m_nProWidth = btnRect.Width();
	m_sliderPro.MoveWindow(VideoBtnPos[VIDEO_CTRL_PROSLIDER].x, VideoBtnPos[VIDEO_CTRL_PROSLIDER].y, btnRect.Width(), btnRect.Height(), FALSE);

	//volume slide 
	m_sliderVol.GetClientRect(&btnRect);
	m_sliderVol.MoveWindow(VideoBtnPos[VIDEO_CTRL_VOLSLIDER].x, VideoBtnPos[VIDEO_CTRL_VOLSLIDER].y, btnRect.Width(), btnRect.Height(), FALSE);
}


void CVideoPlayDlg::OnPaint() 
{
	CPaintDC dc(this); // device context for painting
	
	CBrush nBrush(RGB(16,0,16));	// chroma key of TCCVrenderer
	
	dc.FillRect(&m_videoWindow, &nBrush);

	if(!m_fullScreen)	
	{
		RECT rc;
		rc.left =	VIDEO_PLAY_LEFT;		
		rc.top	=	VIDEO_PLAY_BOTTOM;		
		rc.right =	VIDEO_PLAY_RIGHT;	
		rc.bottom = VIDEO_HEIGHT;	
		CXTMemDC  m_Memdc(&dc,rc);
		
		m_Memdc.SelectObject(&m_BMPBG);
	}
	// Do not call CDialog::OnPaint() for painting messages
}
BOOL CVideoPlayDlg::OnEraseBkgnd(CDC* pDC) 
{
	// Erase the remainder of the dialog as usual
    CDialog::OnEraseBkgnd(pDC);

	return TRUE;
}

void CVideoPlayDlg::OnClose() 
{
	//del battery
	UnregisterBatteryWndToMainUI(m_bat.GetSafeHwnd());
	m_bat.DestroyWindow();
	m_BMPBG.DeleteObject();
#ifdef TESTPLAYER
	if(m_Player.play_state != STATE_STOP)
		m_Player.stop();

	m_Player.release();
#endif
	CDialog::OnOK();
}

void CVideoPlayDlg::VideoPlay()
{
	//kill timer
	KillTimer(TIME_VIDEO_SECID);
	//initialize player
#ifdef TESTPLAYER
	if((m_Player.play_state == STATE_PLAY) ||(m_Player.play_state == STATE_PAUSE))
		m_Player.stop();
	
	m_Player.release();
	
	int len = WideCharToMultiByte(CP_ACP, 0, m_chFileName, -1, NULL, 0, NULL, NULL);
	char* szTarget = new char[len + 1];
	memset(szTarget, 0, len + 1);
    WideCharToMultiByte (CP_ACP, 0,m_chFileName, -1, szTarget, len, NULL,NULL);
	
	printf("m_chFileName = %s \n", szTarget);
	
	delete[] szTarget;
	
	m_Player.Initialize(m_hWnd, m_chFileName);

#endif
	
	//get duration
	GetVideoDuration();
	DisplayTitle();
	//set initialize volume
#ifdef TESTPLAYER
	m_Player.SetVolume(m_nVolume);
#endif
	//play video
	OnPlay();
}

void CVideoPlayDlg::OnPlay() 
{
	// TODO: Add your control notification handler code here

#ifdef TESTPLAYER
	if((m_chFileName[0])&&(m_Player.play_state != STATE_PLAY))
	{
		m_Player.play();
		printf("Video play \n");

 		m_btnPlay.ShowWindow(SW_HIDE);    //SW_HIDE             
 		m_btnPause.ShowWindow(SW_SHOW);   //SW_SHOW
		//set current time int
		if(m_Player.play_state == STATE_PLAY)
			SetTimer(TIME_VIDEO_SECID,1000,NULL);
	}
#endif
}

void CVideoPlayDlg::OnPause() 
{
	// TODO: Add your control notification handler code here
#ifdef TESTPLAYER
	if((m_chFileName[0])&&(m_Player.play_state == STATE_PLAY))
	{
		m_Player.pause();
		printf("video pause \n");

 		m_btnPlay.ShowWindow(SW_SHOW);
 		m_btnPause.ShowWindow(SW_HIDE);
	}
#endif
}

void CVideoPlayDlg::OnStop() 
{
	// TODO: Add your control notification handler code here
	if(m_chFileName[0])
	{
#ifdef TESTPLAYER
		m_Player.stop();
#endif
		printf("video stop \n");
		KillTimer(TIME_VIDEO_SECID);

		m_btnPlay.ShowWindow(SW_SHOW);
		m_btnPause.ShowWindow(SW_HIDE);

		ResetTimeAndSlider();
		if(m_fullScreen == TRUE)
		{
			SwitchFullScreen();
			Invalidate();
		}
	}
}

void CVideoPlayDlg::OnMute() 
{
	// TODO: Add your control notification handler code here
	m_bMute = FALSE;
	
#ifdef TESTPLAYER
	m_Player.SetVolume(m_nVolume);
#endif
	m_btnVol.ShowWindow(SW_SHOW);
	m_btnMute.ShowWindow(SW_HIDE);
}

void CVideoPlayDlg::OnVol() 
{

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -