📄 ctrlmediaframe.cpp
字号:
//
// 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 + -