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

📄 wndmonitor.cpp

📁 著名的下载软件核心Shareaza
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	{
		float nPosition = m_nMediaSeek >= 0 ? m_nMediaSeek : ( CMediaFrame::g_pMediaFrame != NULL ? CMediaFrame::g_pMediaFrame->GetPosition() : 0 );
		CRect rcTrack( &m_rcsMediaSeekTrack ), rcPart;
		
		if ( m_bsMediaSeekTab )
		{
			rcPart.CopyRect( &m_rcsMediaSeekTab );
			
			if ( m_bMediaSeek || m_nMediaSeek >= 0 )
				rcPart.OffsetRect( rcPart.Width(), 0 );
			
			m_rcMediaSeekTab.left	= rcTrack.left + (int)( nPosition * ( rcTrack.Width() - rcPart.Width() ) );
			m_rcMediaSeekTab.right	= m_rcMediaSeekTab.left + rcPart.Width();
			m_rcMediaSeekTab.top	= rcTrack.top;
			m_rcMediaSeekTab.bottom	= rcTrack.top + rcPart.Height();
			
			pDC->BitBlt( m_rcMediaSeekTab.left, m_rcMediaSeekTab.top, m_rcMediaSeekTab.Width(),
				m_rcMediaSeekTab.Height(), &m_pSkin->m_dcSkin, rcPart.left, rcPart.top, SRCCOPY );
			pDC->ExcludeClipRect( &m_rcMediaSeekTab );
			
			rcTrack.right = m_rcMediaSeekTab.left;
		}
		
		if ( m_bsMediaSeekBar )
		{
			rcPart.CopyRect( &m_rcsMediaSeekBar );
			CRect rcBar( &rcTrack );
			
			while ( rcBar.left < rcBar.right )
			{
				pDC->BitBlt( rcBar.left, rcBar.top, min( rcBar.Width(), rcPart.Width() ),
					rcPart.Height(), &m_pSkin->m_dcSkin, rcPart.left, rcPart.top, SRCCOPY );
				rcBar.left += rcPart.Width();
			}
		}
	}
	
	if ( m_bsMediaVolTrack )
	{
		float nPosition = (float)Settings.MediaPlayer.Volume;
		CRect rcTrack( &m_rcsMediaVolTrack ), rcPart;
		
		if ( m_bsMediaVolTab )
		{
			rcPart.CopyRect( &m_rcsMediaVolTab );
			
			if ( m_bMediaVol || m_nMediaVol >= 0 )
				rcPart.OffsetRect( rcPart.Width(), 0 );
			
			m_rcMediaVolTab.left	= rcTrack.left + (int)( nPosition * ( rcTrack.Width() - rcPart.Width() ) );
			m_rcMediaVolTab.right	= m_rcMediaVolTab.left + rcPart.Width();
			m_rcMediaVolTab.top		= rcTrack.top;
			m_rcMediaVolTab.bottom	= rcTrack.top + rcPart.Height();
			
			pDC->BitBlt( m_rcMediaVolTab.left, m_rcMediaVolTab.top, m_rcMediaVolTab.Width(),
				m_rcMediaVolTab.Height(), &m_pSkin->m_dcSkin, rcPart.left, rcPart.top, SRCCOPY );
			pDC->ExcludeClipRect( &m_rcMediaVolTab );
			
			rcTrack.right = m_rcMediaVolTab.left;
		}
		
		if ( m_bsMediaVolBar )
		{
			rcPart.CopyRect( &m_rcsMediaVolBar );
			rcTrack.right = min( rcTrack.right, rcTrack.left + rcPart.Width() );
			pDC->BitBlt( rcTrack.left, rcTrack.top, rcTrack.Width(),
				rcPart.Height(), &m_pSkin->m_dcSkin, rcPart.left, rcPart.top, SRCCOPY );
		}
	}
	
	if ( m_bsStatusText && CMediaFrame::g_pMediaFrame != NULL && ! m_bStatus )
	{
		m_bStatus |= CMediaFrame::g_pMediaFrame->PaintStatusMicro( *pDC, m_rcsStatusText );
	}
	
	if ( CMediaFrame::g_pMediaFrame != NULL )
	{
		MediaState nState = CMediaFrame::g_pMediaFrame->GetState();
		int nImage = 0;
		
		if ( nState >= smsPlaying )
			nImage = 1;
		else if ( nState >= smsPaused )
			nImage = 2;
		
		if ( m_bsMediaStates[0][nImage] && m_bsMediaStates[1][nImage] )
		{
			CRect* prcAnchor = &m_rcsMediaStates[0][nImage];
			CRect* prcPart = &m_rcsMediaStates[1][nImage];
			
			pDC->BitBlt( prcAnchor->left, prcAnchor->top,
				prcAnchor->Width(), prcAnchor->Height(), &m_pSkin->m_dcSkin,
				prcPart->left, prcPart->top, SRCCOPY );
		}
	}
}

/////////////////////////////////////////////////////////////////////////////
// CRemoteWnd paint status functionality

void CRemoteWnd::PaintStatus(CDC* pDC)
{
	if ( m_bsStatusText && ! m_bStatus )
	{
		pDC->DrawText( m_sStatus, &m_rcsStatusText, DT_SINGLELINE|DT_CENTER|DT_VCENTER|DT_NOPREFIX|DT_END_ELLIPSIS );
	}
}

/////////////////////////////////////////////////////////////////////////////
// CRemoteWnd mouse interaction

void CRemoteWnd::OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS* lpncsp)
{
}

UINT CRemoteWnd::OnNcHitTest(CPoint point)
{
	return HTCLIENT;
}

BOOL CRemoteWnd::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
	CPoint point;
	GetCursorPos( &point );
	ScreenToClient( &point );
	
	BOOL bAvailable = CMediaFrame::g_pMediaFrame != NULL;
	
	if ( m_bsScalerTrack && m_rcScalerTab.PtInRect( point ) )
	{
		if ( ! m_bScaler ) Invalidate();
		m_bScaler = TRUE;
	}
	else if ( bAvailable && m_bsMediaSeekTrack && m_rcMediaSeekTab.PtInRect( point ) )
	{
		if ( ! m_bMediaSeek ) Invalidate();
		m_bMediaSeek = TRUE;
	}
	else if ( bAvailable && m_bsMediaVolTrack && m_rcMediaVolTab.PtInRect( point ) )
	{
		if ( ! m_bMediaVol ) Invalidate();
		m_bMediaVol = TRUE;
	}
	else if ( m_bScaler || m_bMediaSeek || m_bMediaVol )
	{
		m_bScaler = m_bMediaSeek = m_bMediaVol = FALSE;
		Invalidate();
	}
	
	if ( HitTestButtons( point ) != NULL )
	{
		SetCursor( AfxGetApp()->LoadCursor( IDC_HAND ) );
		return TRUE;
	}
	else if ( m_bsScalerTrack && m_rcsScalerTrack.PtInRect( point ) )
	{
		SetCursor( AfxGetApp()->LoadCursor( IDC_HAND ) );
		return TRUE;
	}
	else if ( bAvailable && m_bsMediaSeekTrack && m_rcsMediaSeekTrack.PtInRect( point ) )
	{
		SetCursor( AfxGetApp()->LoadCursor( IDC_HAND ) );
		return TRUE;
	}
	else if ( bAvailable && m_bsMediaVolTrack && m_rcsMediaVolTrack.PtInRect( point ) )
	{
		SetCursor( AfxGetApp()->LoadCursor( IDC_HAND ) );
		return TRUE;
	}
    else
	{
		SetCursor( AfxGetApp()->LoadStandardCursor( IDC_ARROW ) );
		return TRUE;
	}
}

void CRemoteWnd::OnMouseMove(UINT nFlags, CPoint point)
{
	CmdButton* pButton = HitTestButtons( point );
	
	if ( m_pCmdHover != pButton )
	{
		m_pCmdHover = pButton;
		Invalidate();
	}
	
	if ( m_pCmdDown == NULL ) CWnd::OnMouseMove(nFlags, point);
}

void CRemoteWnd::OnLButtonDown(UINT nFlags, CPoint point)
{
	SetActiveWindow();
	SetFocus();
	
	if ( CmdButton* pButton = HitTestButtons( point ) )
	{
		m_pCmdDown = m_pCmdHover = pButton;
		Invalidate();
		SetCapture();
	}
	else if ( m_bsScalerTrack && m_rcsScalerTrack.PtInRect( point ) )
	{
		TrackScaler();
	}
	else if ( m_bsMediaSeekTrack && m_rcsMediaSeekTrack.PtInRect( point ) )
	{
		TrackSeek();
	}
	else if ( m_bsMediaVolTrack && m_rcsMediaVolTrack.PtInRect( point ) )
	{
		TrackVol();
	}
	else
	{
		ClientToScreen( &point );
		SendMessage( WM_NCLBUTTONDOWN, HTCAPTION, MAKELONG( point.x, point.y ) );
	}
}

void CRemoteWnd::OnLButtonUp(UINT nFlags, CPoint point)
{
	if ( m_pCmdDown != NULL )
	{
		BOOL bOK = ( m_pCmdDown == m_pCmdHover );
		
		m_pCmdDown = NULL;
		Invalidate();
		ReleaseCapture();
		
		if ( bOK )
		{
			UpdateWindow();
			m_pCmdHover->Execute( (CFrameWnd*)AfxGetMainWnd() );
			UpdateCmdButtons();
		}
	}
	else
	{
		ClientToScreen( &point );
		SendMessage( WM_NCLBUTTONUP, HTCAPTION, MAKELONG( point.x, point.y ) );
	}
}

void CRemoteWnd::OnNcLButtonDblClk(UINT nFlags, CPoint point)
{
	if ( m_bsHistoryDest && m_rcsHistoryDest.PtInRect( point ) )
	{
		AfxGetMainWnd()->PostMessage( WM_COMMAND, ID_TAB_HOME );
	}
	else if ( m_bsStatusText && m_rcsStatusText.PtInRect( point ) )
	{
		AfxGetMainWnd()->PostMessage( WM_COMMAND, ID_TAB_MEDIA );
	}
	else
	{
		AfxGetMainWnd()->PostMessage( WM_COMMAND, ID_TRAY_OPEN );
	}
}

void CRemoteWnd::OnRButtonDown(UINT nFlags, CPoint point)
{
	CMenu* pMenu = Skin.GetMenu( _T("CRemoteWnd") );
	if ( pMenu == NULL ) pMenu = Skin.GetMenu( _T("CMainWnd.Tray") );
	if ( pMenu == NULL ) return;
	
	MENUITEMINFO pInfo;
	pInfo.cbSize	= sizeof(pInfo);
	pInfo.fMask		= MIIM_STATE;
	GetMenuItemInfo( pMenu->GetSafeHmenu(), ID_TRAY_OPEN, FALSE, &pInfo );
	pInfo.fState	|= MFS_DEFAULT;
	SetMenuItemInfo( pMenu->GetSafeHmenu(), ID_TRAY_OPEN, FALSE, &pInfo );
	
	ClientToScreen( &point );
	pMenu->TrackPopupMenu( TPM_CENTERALIGN|TPM_TOPALIGN|TPM_RIGHTBUTTON,
		point.x, point.y, AfxGetMainWnd(), NULL );
}

INT_PTR CRemoteWnd::OnToolHitTest(CPoint point, TOOLINFO* pTI) const
{
	if ( CmdButton* pButton = HitTestButtons( point ) )
	{
		CString strTip;
		
		if ( LoadString( strTip, pButton->m_nID ) )
		{
			if ( LPCTSTR pszBreak = _tcschr( strTip, '\n' ) )
			{
				pTI->lpszText = _tcsdup( pszBreak + 1 );
			}
			else
			{
				strTip = strTip.SpanExcluding( _T(".") );
				pTI->lpszText = _tcsdup( strTip );
			}
		}
		
		pTI->hwnd		= GetSafeHwnd();
		pTI->uId		= pButton->m_nID;
		pTI->uFlags		= pTI->uFlags & ~TTF_IDISHWND;
		pTI->rect		= pButton->m_rc;
		
		return pTI->uId;
	}
	
	return CWnd::OnToolHitTest( point, pTI );
}

/////////////////////////////////////////////////////////////////////////////
// CRemoteWnd trackers

void CRemoteWnd::TrackScaler()
{
	MSG* pMsg = &AfxGetThreadState()->m_msgCur;
	CRect rcTrack( &m_rcsScalerTrack );
	CPoint point;
	
	ClientToScreen( &rcTrack );
	ClipCursor( &rcTrack );
	ScreenToClient( &rcTrack );
	SetCapture();
	
	rcTrack.DeflateRect( m_rcScalerTab.Width() / 2, 0 );
	
	while ( GetAsyncKeyState( VK_LBUTTON ) & 0x8000 )
	{
		while ( ::PeekMessage( pMsg, NULL, WM_MOUSEFIRST, WM_MOUSELAST, PM_REMOVE ) );
		
		if ( ! AfxGetThread()->PumpMessage() )
		{
			AfxPostQuitMessage( 0 );
			break;
		}
		
		GetCursorPos( &point );
		ScreenToClient( &point );
		
		int nPosition = (int)( 105.0f * (float)( point.x - rcTrack.left ) / (float)rcTrack.Width() );
		if ( nPosition < 0 ) nPosition = 0;
		else if ( nPosition >= 102 ) nPosition = 101;
		else if ( nPosition >= 100 ) nPosition = 100;
		
		if ( nPosition != (int)Settings.Live.BandwidthScale )
		{
			Settings.Live.BandwidthScale = (DWORD)nPosition;
			Invalidate();
		}
	}
	
	ReleaseCapture();
	ClipCursor( NULL );
	Invalidate();
}

void CRemoteWnd::TrackSeek()
{
	MSG* pMsg = &AfxGetThreadState()->m_msgCur;
	CRect rcTrack( &m_rcsMediaSeekTrack );
	CPoint point;
	
	if ( CMediaFrame::g_pMediaFrame == NULL ) return;
	
	ClientToScreen( &rcTrack );
	ClipCursor( &rcTrack );
	ScreenToClient( &rcTrack );
	SetCapture();
	
	rcTrack.DeflateRect( m_rcMediaSeekTab.Width() / 2, 0 );
	
	while ( GetAsyncKeyState( VK_LBUTTON ) & 0x8000 )
	{
		while ( ::PeekMessage( pMsg, NULL, WM_MOUSEFIRST, WM_MOUSELAST, PM_REMOVE ) );
		
		if ( ! AfxGetThread()->PumpMessage() )
		{
			AfxPostQuitMessage( 0 );
			break;
		}
		
		GetCursorPos( &point );
		ScreenToClient( &point );
		
		float nPosition = (float)( point.x - rcTrack.left ) / (float)rcTrack.Width();
		if ( nPosition < 0.0f ) nPosition = 0.0f;
		if ( nPosition > 1.0f ) nPosition = 1.0f;
		
		if ( nPosition != m_nMediaSeek )
		{
			m_nMediaSeek = nPosition;
			Invalidate();
		}
	}
	
	ReleaseCapture();
	ClipCursor( NULL );
	
	CMediaFrame::g_pMediaFrame->SeekTo( m_nMediaSeek );
	m_nMediaSeek = -1;
	Invalidate();
}

void CRemoteWnd::TrackVol()
{
	MSG* pMsg = &AfxGetThreadState()->m_msgCur;
	CRect rcTrack( &m_rcsMediaVolTrack );
	CPoint point;
	
	if ( CMediaFrame::g_pMediaFrame == NULL ) return;
	
	ClientToScreen( &rcTrack );
	ClipCursor( &rcTrack );
	ScreenToClient( &rcTrack );
	SetCapture();
	
	rcTrack.DeflateRect( m_rcMediaVolTab.Width() / 2, 0 );
	
	while ( GetAsyncKeyState( VK_LBUTTON ) & 0x8000 )
	{
		while ( ::PeekMessage( pMsg, NULL, WM_MOUSEFIRST, WM_MOUSELAST, PM_REMOVE ) );
		
		if ( ! AfxGetThread()->PumpMessage() )
		{
			AfxPostQuitMessage( 0 );
			break;
		}
		
		GetCursorPos( &point );
		ScreenToClient( &point );
		
		float nPosition = (float)( point.x - rcTrack.left ) / (float)rcTrack.Width();
		if ( nPosition < 0.0f ) nPosition = 0.0f;
		if ( nPosition > 1.0f ) nPosition = 1.0f;
		
		if ( nPosition != m_nMediaVol )
		{
			m_nMediaVol = nPosition;
			CMediaFrame::g_pMediaFrame->SetVolume( m_nMediaVol );
			Invalidate();
		}
	}
	
	ReleaseCapture();
	ClipCursor( NULL );
	
	m_nMediaVol = -1;
	Invalidate();
}


/////////////////////////////////////////////////////////////////////////////
// CRemoteWnd::CmdButton construction

CRemoteWnd::CmdButton::CmdButton(LPCTSTR pszName) : m_rc( 0, 0, 0, 0 )
{
	m_nID		= CoolInterface.NameToID( pszName + 1 );
	m_sName		= pszName;
	m_bVisible	= TRUE;
	m_bEnabled	= TRUE;
	m_bChecked	= FALSE;
	if ( m_nID == 0 ) m_nID = 1;
}

BOOL CRemoteWnd::CmdButton::HitTest(const CPoint& point, BOOL bAll) const
{
	return ( bAll || m_bEnabled ) && m_rc.PtInRect( point );
}

void CRemoteWnd::CmdButton::Show(BOOL bShow)
{
	if ( m_bVisible == bShow ) return;
	m_bVisible = bShow;
	m_bChanged = TRUE;
}

void CRemoteWnd::CmdButton::Enable(BOOL bOn)
{
	m_bEnableChanged = TRUE;
	if ( m_bEnabled == bOn ) return;
	m_bEnabled = bOn;
	m_bChanged = TRUE;
}

void CRemoteWnd::CmdButton::SetCheck(int nCheck)
{
	if ( m_bChecked == ( nCheck != 0 ) ) return;
	m_bChecked = ( nCheck != 0 );
	m_bChanged = TRUE;
}

void CRemoteWnd::CmdButton::Execute(CFrameWnd* pTarget)
{
	if ( m_bVisible && m_bEnabled )
	{
		pTarget->SendMessage( WM_COMMAND, m_nID );
	}
}

void CRemoteWnd::CmdButton::Paint(CDC* pdcWindow, CRect& rcWindow, CSkinWindow* pSkin, CmdButton* pHover, CmdButton* pDown)
{
	ASSERT( pSkin != NULL );
	pSkin->GetAnchor( m_sName, m_rc );
	
	if ( ! m_bVisible )
	{
		return;
	}
	else if ( m_bChecked )
	{
		if ( ! pSkin->PaintPartOnAnchor( pdcWindow, rcWindow, m_sName + _T(".Checked"), m_sName ) )
			pSkin->PaintPartOnAnchor( pdcWindow, rcWindow, m_sName + _T(".Down"), m_sName );
	}
	else if ( ! m_bEnabled )
	{
		pSkin->PaintPartOnAnchor( pdcWindow, rcWindow, m_sName + _T(".Disabled"), m_sName );
	}
	else if ( pHover == this && pDown == this )
	{
		pSkin->PaintPartOnAnchor( pdcWindow, rcWindow, m_sName + _T(".Down"), m_sName );
	}
	else if ( ( pHover == this && pDown == NULL ) || ( pDown == this ) )
	{
		pSkin->PaintPartOnAnchor( pdcWindow, rcWindow, m_sName + _T(".Hover"), m_sName );
	}
	else
	{
		pSkin->PaintPartOnAnchor( pdcWindow, rcWindow, m_sName + _T(".Up"), m_sName );
	}
}

⌨️ 快捷键说明

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