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

📄 ctrlmediaframe.cpp

📁 著名的下载软件核心Shareaza
💻 CPP
📖 第 1 页 / 共 3 页
字号:
//
// CtrlMediaFrame.cpp
//
// Copyright (c) Shareaza Development Team, 2002-2004.
// This file is part of SHAREAZA (www.shareaza.com)
//
// Shareaza is free software; you can redistribute it
// and/or modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2 of
// the License, or (at your option) any later version.
//
// Shareaza is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Shareaza; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
//

#include "StdAfx.h"
#include "Shareaza.h"
#include "Settings.h"
#include "ImageServices.h"
#include "Plugins.h"
#include "Library.h"
#include "SharedFile.h"

#include "Skin.h"
#include "ShellIcons.h"
#include "CtrlMediaFrame.h"
#include "DlgSettingsManager.h"
#include "DlgMediaVis.h"

IMPLEMENT_DYNAMIC(CMediaFrame, CWnd)

BEGIN_MESSAGE_MAP(CMediaFrame, CWnd)
	ON_WM_CREATE()
	ON_WM_DESTROY()
	ON_WM_SIZE()
	ON_WM_PAINT()
	ON_WM_TIMER()
	ON_WM_CONTEXTMENU()
	ON_WM_HSCROLL()
	ON_WM_CLOSE()
	ON_WM_SETCURSOR()
	ON_WM_LBUTTONDOWN()
	ON_WM_SYSCOMMAND()
	ON_WM_LBUTTONDBLCLK()
	ON_UPDATE_COMMAND_UI(ID_MEDIA_CLOSE, OnUpdateMediaClose)
	ON_COMMAND(ID_MEDIA_CLOSE, OnMediaClose)
	ON_UPDATE_COMMAND_UI(ID_MEDIA_PLAY, OnUpdateMediaPlay)
	ON_COMMAND(ID_MEDIA_PLAY, OnMediaPlay)
	ON_UPDATE_COMMAND_UI(ID_MEDIA_PAUSE, OnUpdateMediaPause)
	ON_COMMAND(ID_MEDIA_PAUSE, OnMediaPause)
	ON_UPDATE_COMMAND_UI(ID_MEDIA_STOP, OnUpdateMediaStop)
	ON_COMMAND(ID_MEDIA_STOP, OnMediaStop)
	ON_COMMAND(ID_MEDIA_ZOOM, OnMediaZoom)
	ON_UPDATE_COMMAND_UI(ID_MEDIA_SIZE_FILL, OnUpdateMediaSizeFill)
	ON_COMMAND(ID_MEDIA_SIZE_FILL, OnMediaSizeFill)
	ON_UPDATE_COMMAND_UI(ID_MEDIA_SIZE_DISTORT, OnUpdateMediaSizeDistort)
	ON_COMMAND(ID_MEDIA_SIZE_DISTORT, OnMediaSizeDistort)
	ON_UPDATE_COMMAND_UI(ID_MEDIA_SIZE_ONE, OnUpdateMediaSizeOne)
	ON_COMMAND(ID_MEDIA_SIZE_ONE, OnMediaSizeOne)
	ON_UPDATE_COMMAND_UI(ID_MEDIA_SIZE_TWO, OnUpdateMediaSizeTwo)
	ON_COMMAND(ID_MEDIA_SIZE_TWO, OnMediaSizeTwo)
	ON_UPDATE_COMMAND_UI(ID_MEDIA_SIZE_THREE, OnUpdateMediaSizeThree)
	ON_COMMAND(ID_MEDIA_SIZE_THREE, OnMediaSizeThree)
	ON_UPDATE_COMMAND_UI(ID_MEDIA_ASPECT_DEFAULT, OnUpdateMediaAspectDefault)
	ON_COMMAND(ID_MEDIA_ASPECT_DEFAULT, OnMediaAspectDefault)
	ON_UPDATE_COMMAND_UI(ID_MEDIA_ASPECT_4_3, OnUpdateMediaAspect43)
	ON_COMMAND(ID_MEDIA_ASPECT_4_3, OnMediaAspect43)
	ON_UPDATE_COMMAND_UI(ID_MEDIA_ASPECT_16_9, OnUpdateMediaAspect169)
	ON_COMMAND(ID_MEDIA_ASPECT_16_9, OnMediaAspect169)
	ON_UPDATE_COMMAND_UI(ID_MEDIA_FULLSCREEN, OnUpdateMediaFullScreen)
	ON_COMMAND(ID_MEDIA_FULLSCREEN, OnMediaFullScreen)
	ON_UPDATE_COMMAND_UI(ID_MEDIA_PLAYLIST, OnUpdateMediaPlaylist)
	ON_COMMAND(ID_MEDIA_PLAYLIST, OnMediaPlaylist)
	ON_COMMAND(ID_MEDIA_SETTINGS, OnMediaSettings)
	ON_UPDATE_COMMAND_UI(ID_MEDIA_SETTINGS, OnUpdateMediaSettings)
	ON_COMMAND(ID_MEDIA_VIS, OnMediaVis)
	ON_UPDATE_COMMAND_UI(ID_MEDIA_VIS, OnUpdateMediaVis)
	ON_UPDATE_COMMAND_UI(ID_MEDIA_STATUS, OnUpdateMediaStatus)
	ON_COMMAND(ID_MEDIA_STATUS, OnMediaStatus)
	ON_UPDATE_COMMAND_UI(ID_MEDIA_MUTE, OnUpdateMediaMute)
	ON_COMMAND(ID_MEDIA_MUTE, OnMediaMute)
	ON_NOTIFY(MLN_NEWCURRENT, IDC_MEDIA_PLAYLIST, OnNewCurrent)
	ON_MESSAGE(0x0319, OnMediaKey)
END_MESSAGE_MAP()

#define SIZE_INTERNAL	1982
#define SIZE_BARSLIDE	1983
#define TOOLBAR_HEIGHT	28
#define TOOLBAR_STICK	4000
#define TOOLBAR_ANIMATE	1000
#define HEADER_HEIGHT	16
#define STATUS_HEIGHT	18
#define SPLIT_SIZE		6
#define META_DELAY		10000
#define TIME_FACTOR		1000000
#define ONE_SECOND		10000000

CMediaFrame* CMediaFrame::g_pMediaFrame = NULL;


/////////////////////////////////////////////////////////////////////////////
// CMediaFrame construction

CMediaFrame::CMediaFrame()
{
	if ( g_pMediaFrame == NULL ) g_pMediaFrame = this;
	
	m_pPlayer		= NULL;
	m_nState		= smsNull;
	m_bMute			= FALSE;
	m_bThumbPlay	= FALSE;
	m_bAutoPlay		= TRUE;
	m_tLastPlay		= 0;
	m_tMetadata		= 0;
	
	m_bFullScreen		= FALSE;
	m_bListVisible		= Settings.MediaPlayer.ListVisible;
	m_nListSize			= Settings.MediaPlayer.ListSize;
	m_bStatusVisible	= Settings.MediaPlayer.StatusVisible;
}

CMediaFrame::~CMediaFrame()
{
	if ( g_pMediaFrame == this ) g_pMediaFrame = NULL;
}

/////////////////////////////////////////////////////////////////////////////
// CMediaFrame system message handlers

BOOL CMediaFrame::Create(CWnd* pParentWnd) 
{
	CRect rect;
	return CWnd::Create( NULL, _T("CMediaFrame"), WS_CHILD|WS_VISIBLE|WS_CLIPCHILDREN,
		rect, pParentWnd, IDC_MEDIA_FRAME, NULL );
}

int CMediaFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if ( CWnd::OnCreate( lpCreateStruct ) == -1 ) return -1;
	
	CRect rectDefault;
	SetOwner( GetParent() );
	
	m_wndList.Create( this, IDC_MEDIA_PLAYLIST );
	
	if ( ! m_wndListBar.Create( this, WS_CHILD|CBRS_NOALIGN, AFX_IDW_TOOLBAR ) ) return -1;
	m_wndListBar.SetBarStyle( m_wndListBar.GetBarStyle() | CBRS_TOOLTIPS | CBRS_BORDER_TOP );
	m_wndListBar.SetOwner( GetOwner() );
	
	if ( ! m_wndToolBar.Create( this, WS_CHILD|WS_VISIBLE|CBRS_NOALIGN, AFX_IDW_TOOLBAR ) ) return -1;
	m_wndToolBar.SetBarStyle( m_wndToolBar.GetBarStyle() | CBRS_TOOLTIPS | CBRS_BORDER_TOP );
	m_wndToolBar.SetOwner( GetOwner() );
	
	m_wndPosition.Create( WS_CHILD|WS_TABSTOP|TBS_HORZ|TBS_NOTICKS|TBS_TOP,
		rectDefault, &m_wndToolBar, IDC_MEDIA_POSITION );
	m_wndPosition.SetRange( 0, 0 );
	m_wndPosition.SetPageSize( 0 );
	
	m_wndSpeed.Create( WS_CHILD|WS_TABSTOP|TBS_HORZ|TBS_NOTICKS|TBS_TOP,
		rectDefault, &m_wndToolBar, IDC_MEDIA_SPEED );
	m_wndSpeed.SetRange( 0, 200 );
	m_wndSpeed.SetTic( 0 );
	m_wndSpeed.SetTic( 100 );
	m_wndSpeed.SetTic( 200 );
	
	m_wndVolume.Create( WS_CHILD|WS_TABSTOP|TBS_HORZ|TBS_NOTICKS|TBS_TOP,
		rectDefault, &m_wndToolBar, IDC_MEDIA_VOLUME );
	m_wndVolume.SetRange( 0, 100 );
	m_wndVolume.SetTic( 0 );
	m_wndVolume.SetTic( 100 );
	
	CBitmap bmIcons;
	bmIcons.LoadBitmap( IDB_MEDIA_STATES );
	m_pIcons.Create( 16, 16, ILC_COLOR16|ILC_MASK, 3, 0 );
	m_pIcons.Add( &bmIcons, RGB( 0, 255, 0 ) );
	
	UpdateState();
	
	SetTimer( 1, 200, NULL );
	
	return 0;
}

void CMediaFrame::OnDestroy() 
{
	Settings.MediaPlayer.ListVisible	= m_bListVisible;
	Settings.MediaPlayer.ListSize		= m_nListSize;
	Settings.MediaPlayer.StatusVisible	= m_bStatusVisible;
	
	KillTimer( 2 );
	KillTimer( 1 );
	
	Cleanup();
	
	CWnd::OnDestroy();
}

BOOL CMediaFrame::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo) 
{
	if ( m_wndList.m_hWnd )
	{
		if ( m_wndList.OnCmdMsg( nID, nCode, pExtra, pHandlerInfo ) ) return TRUE;
	}
	if ( m_wndListBar.m_hWnd )
	{
		if ( m_wndListBar.OnCmdMsg( nID, nCode, pExtra, pHandlerInfo ) ) return TRUE;
	}
	if ( m_wndToolBar.m_hWnd )
	{
		if ( m_wndToolBar.OnCmdMsg( nID, nCode, pExtra, pHandlerInfo ) ) return TRUE;
	}
	
	return CWnd::OnCmdMsg( nID, nCode, pExtra, pHandlerInfo );
}

void CMediaFrame::OnSysCommand(UINT nID, LPARAM lParam) 
{
	switch ( nID & 0xFFF0 )
	{
	case SC_SCREENSAVE:
	case SC_MONITORPOWER:
		if ( m_nState == smsPlaying ) return;
		break;
	}
	
	CWnd::OnSysCommand( nID, lParam );
}

BOOL CMediaFrame::PreTranslateMessage(MSG* pMsg) 
{
	if ( pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_ESCAPE )
	{
		if ( m_bFullScreen )
		{
			SetFullScreen( FALSE );
			return TRUE;
		}
	}
	else if ( pMsg->message == WM_SYSKEYDOWN && pMsg->wParam == VK_RETURN )
	{
		SetFullScreen( ! m_bFullScreen );
		return TRUE;
	}
	else if ( pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_LEFT )
	{
		if ( GetAsyncKeyState( VK_CONTROL ) & 0x8000 )
		{
			m_wndList.PostMessage( WM_COMMAND, ID_MEDIA_PREVIOUS );
			return TRUE;
		}
	}
	else if ( pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_RIGHT )
	{
		if ( GetAsyncKeyState( VK_CONTROL ) & 0x8000 )
		{
			m_wndList.PostMessage( WM_COMMAND, ID_MEDIA_NEXT );
			return TRUE;
		}
	}

	return CWnd::PreTranslateMessage( pMsg );
}

/////////////////////////////////////////////////////////////////////////////
// CMediaFrame presentation message handlers

void CMediaFrame::OnSkinChange()
{
	Skin.CreateToolBar( _T("CMediaFrame"), &m_wndToolBar );
	Skin.CreateToolBar( _T("CMediaList"), &m_wndListBar );
	
	if ( CCoolBarItem* pItem = m_wndToolBar.GetID( IDC_MEDIA_POSITION ) ) pItem->Enable( FALSE );
	if ( CCoolBarItem* pItem = m_wndToolBar.GetID( IDC_MEDIA_SPEED ) ) pItem->Enable( FALSE );
	if ( CCoolBarItem* pItem = m_wndToolBar.GetID( IDC_MEDIA_VOLUME ) ) pItem->Enable( FALSE );
}

void CMediaFrame::OnUpdateCmdUI()
{
	m_wndToolBar.OnUpdateCmdUI( (CFrameWnd*)GetOwner(), TRUE );
	m_wndListBar.OnUpdateCmdUI( (CFrameWnd*)GetOwner(), TRUE );
}

void CMediaFrame::SetFullScreen(BOOL bFullScreen)
{
	if ( bFullScreen == m_bFullScreen ) return;
	
	ShowWindow( SW_HIDE );
	m_tBarTime = GetTickCount();
	
	if ( m_bFullScreen = bFullScreen )
	{
		ModifyStyle( WS_CHILD, 0 );
		SetParent( NULL );
		SetWindowPos( &wndTopMost, 0, 0, GetSystemMetrics( SM_CXSCREEN ),
			GetSystemMetrics( SM_CYSCREEN ), SWP_FRAMECHANGED|SWP_SHOWWINDOW );
		SetTimer( 2, 50, NULL );
	}
	else
	{
		CWnd* pOwner = GetOwner();
		CRect rc;
		
		ModifyStyle( 0, WS_CHILD );
		SetParent( pOwner );
		
		pOwner->GetClientRect( &rc );
		SetWindowPos( NULL, 0, 0, rc.right, rc.bottom,
			SWP_FRAMECHANGED|SWP_SHOWWINDOW );
		KillTimer( 2 );
	}
}

void CMediaFrame::OnSize(UINT nType, int cx, int cy) 
{
	if ( nType != SIZE_INTERNAL && nType != SIZE_BARSLIDE ) CWnd::OnSize( nType, cx, cy );
	
	CRect rc;
	GetClientRect( &rc );
	
	if ( rc.Width() < 32 || rc.Height() < 32 ) return;
	
	if ( rc.Width() < m_nListSize + SPLIT_SIZE )
	{
		m_nListSize = max( 0, rc.Width() - SPLIT_SIZE );
	}
	
	if ( m_bListVisible || ! m_bFullScreen )
	{
		rc.bottom -= TOOLBAR_HEIGHT;
		m_wndToolBar.SetWindowPos( NULL, rc.left, rc.bottom, rc.Width(),
			TOOLBAR_HEIGHT, SWP_NOZORDER|SWP_SHOWWINDOW );
		
		if ( m_bListVisible )
		{
			rc.right -= m_nListSize;
			m_wndList.SetWindowPos( NULL, rc.right, rc.top + HEADER_HEIGHT, m_nListSize,
				rc.bottom - TOOLBAR_HEIGHT - HEADER_HEIGHT, SWP_NOZORDER|SWP_SHOWWINDOW );
			m_wndListBar.SetWindowPos( NULL, rc.right, rc.bottom - TOOLBAR_HEIGHT,
				m_nListSize, TOOLBAR_HEIGHT, SWP_NOZORDER|SWP_SHOWWINDOW );
			rc.right -= SPLIT_SIZE;
		}
		else if ( m_wndList.IsWindowVisible() )
		{
			m_wndList.ShowWindow( SW_HIDE );
			m_wndListBar.ShowWindow( SW_HIDE );
		}
	}
	else
	{
		if ( m_wndList.IsWindowVisible() )
		{
			m_wndList.ShowWindow( SW_HIDE );
			m_wndListBar.ShowWindow( SW_HIDE );
		}
		
		DWORD tElapse = GetTickCount() - m_tBarTime;
		int nBar = TOOLBAR_HEIGHT;
		
		if ( tElapse < TOOLBAR_STICK )
		{
			nBar = TOOLBAR_HEIGHT;
		}
		else if ( tElapse > TOOLBAR_STICK + TOOLBAR_ANIMATE )
		{
			nBar = 0;
			SetCursor( NULL );
			KillTimer( 2 );
		}
		else
		{
			tElapse -= TOOLBAR_STICK;
			nBar = TOOLBAR_HEIGHT - ( tElapse * TOOLBAR_HEIGHT / TOOLBAR_ANIMATE );
		}
		
		m_wndToolBar.SetWindowPos( NULL, rc.left, rc.bottom - nBar, rc.Width(),
			TOOLBAR_HEIGHT, SWP_NOZORDER|SWP_SHOWWINDOW );
	}
	
	if ( m_bStatusVisible )
	{
		if ( m_bFullScreen )
		{
			m_rcStatus.SetRect( rc.left, rc.top, rc.right, rc.top + STATUS_HEIGHT );
			rc.top += STATUS_HEIGHT;
		}
		else
		{
			m_rcStatus.SetRect( rc.left, rc.bottom - STATUS_HEIGHT, rc.right, rc.bottom );
			rc.bottom -= STATUS_HEIGHT;
		}
	}
	
	m_rcVideo = rc;
	
	if ( m_pPlayer != NULL && nType != SIZE_BARSLIDE )
	{
		m_pPlayer->Reposition( &rc );
	}
	
	if ( nType != SIZE_BARSLIDE ) Invalidate();
}

void CMediaFrame::OnPaint() 
{
	CPaintDC dc( this );
	
	if ( m_bmLogo.m_hObject == NULL)
	{
		if ( CImageServices::LoadBitmap( &m_bmLogo, IDR_LARGE_LOGO, RT_JPEG ) )
		{
			if ( m_pPlayer ) m_pPlayer->SetLogoBitmap( (HBITMAP)m_bmLogo.m_hObject );
		}
	}
	
	if ( m_pFontDefault.m_hObject == NULL )
	{
		LOGFONT pFont = { 80, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, DEFAULT_CHARSET,
			OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
			DEFAULT_PITCH|FF_DONTCARE, _T("Verdana") };
		
		m_pFontDefault.CreatePointFontIndirect( &pFont );
		
		pFont.lfHeight = 80;
		m_pFontValue.CreatePointFontIndirect( &pFont );
		pFont.lfWeight = FW_BLACK;
		m_pFontKey.CreatePointFontIndirect( &pFont );
	}
	
	CFont* pOldFont = (CFont*)dc.SelectObject( &m_pFontDefault );
	
	CRect rcClient;
	GetClientRect( &rcClient );
	
	if ( m_bListVisible )
	{
		CRect rcBar(	rcClient.right - m_nListSize - SPLIT_SIZE,
						rcClient.top,
						rcClient.right - m_nListSize,
						rcClient.bottom );
		
		dc.FillSolidRect( rcBar.left, rcBar.top, 1, rcBar.Height(), GetSysColor( COLOR_BTNFACE ) );
		dc.FillSolidRect( rcBar.left + 1, rcBar.top, 1, rcBar.Height(), GetSysColor( COLOR_3DHIGHLIGHT ) );
		dc.FillSolidRect( rcBar.right - 1, rcBar.top, 1, rcBar.Height(), GetSysColor( COLOR_3DSHADOW ) );
		dc.FillSolidRect( rcBar.left + 2, rcBar.top, rcBar.Width() - 3, rcBar.Height(), GetSysColor( COLOR_BTNFACE ) );
		dc.ExcludeClipRect( &rcBar );
		
		rcBar.SetRect( rcBar.right, rcClient.top,
			rcClient.right, rcClient.top + HEADER_HEIGHT );
		
		if ( dc.RectVisible( &rcBar ) ) PaintListHeader( dc, rcBar );
	}
	
	if ( m_bStatusVisible )
	{
		CRect rcStatus( &m_rcStatus );
		if ( dc.RectVisible( &rcStatus ) ) PaintStatus( dc, rcStatus );
	}
	
	if ( m_pPlayer == NULL )
	{
		if ( dc.RectVisible( &m_rcVideo ) ) PaintSplash( dc, m_rcVideo );
	}
	
	dc.SelectObject( pOldFont );
}

void CMediaFrame::PaintSplash(CDC& dc, CRect& rcBar)
{
	if ( m_bmLogo.m_hObject == NULL )
	{
		dc.FillSolidRect( &m_rcVideo, 0 );
		return;
	}
	
	BITMAP pInfo;
	m_bmLogo.GetBitmap( &pInfo );
	
	CPoint pt = m_rcVideo.CenterPoint();
	pt.x -= pInfo.bmWidth / 2;
	pt.y -= ( pInfo.bmHeight + 32 ) / 2;
	
	CDC dcMem;
	dcMem.CreateCompatibleDC( &dc );
	CBitmap* pOldBmp = (CBitmap*)dcMem.SelectObject( &m_bmLogo );
	dc.BitBlt( pt.x, pt.y, pInfo.bmWidth, pInfo.bmHeight, &dcMem,
		0, 0, SRCCOPY );
	dc.ExcludeClipRect( pt.x, pt.y, pt.x + pInfo.bmWidth, pt.y + pInfo.bmHeight );
	dcMem.SelectObject( pOldBmp );
	
	CRect rcText( m_rcVideo.left, pt.y + pInfo.bmHeight, m_rcVideo.right, pt.y + pInfo.bmHeight + 32 );
	
	CString strText = _T("S     H     A     R     E     A     Z     A           M     E     D     I     A           S     Y     S     T     E     M");
	pt.x = ( m_rcVideo.left + m_rcVideo.right ) / 2 - dc.GetTextExtent( strText ).cx / 2;
	pt.y = rcText.top + 8;
	
	dc.SetBkColor( 0 );
	dc.SetTextColor( RGB( 200, 200, 255 ) );
	dc.ExtTextOut( pt.x, pt.y, ETO_OPAQUE, &m_rcVideo, strText, NULL );
	dc.ExcludeClipRect( &rcText );
	
	dc.FillSolidRect( &m_rcVideo, 0 );
}

void CMediaFrame::PaintListHeader(CDC& dc, CRect& rcBar)
{
	CPoint pt = rcBar.CenterPoint();
	CString strText = _T("P L A Y L I S T");
	CSize szText = dc.GetTextExtent( strText );
	pt.x -= szText.cx / 2; pt.y -= szText.cy / 2;
	dc.SetBkMode( OPAQUE );
	dc.SetBkColor( RGB( 0, 0, 0x80 ) );
	dc.SetTextColor( RGB( 0xFF, 0xFF, 0 ) );
	dc.ExtTextOut( pt.x, pt.y, ETO_OPAQUE|ETO_CLIPPED, &rcBar, strText, NULL );
}

void CMediaFrame::PaintStatus(CDC& dc, CRect& rcBar)
{
	COLORREF crBack = RGB( 0x00, 0x00, 0x60 );

⌨️ 快捷键说明

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