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

📄 ctrllibraryalbumview.cpp

📁 p2p软件
💻 CPP
📖 第 1 页 / 共 2 页
字号:
}

void CLibraryAlbumView::OnPaint() 
{
	CPaintDC dc( this );
	
	CRect rcBuffer( 0, 0, m_szTrack.cx, m_szTrack.cy );
	CDC* pBuffer = CoolInterface.GetBuffer( dc, m_szTrack );
	
	CFont* pOldFont = (CFont*)pBuffer->SelectObject( &CoolInterface.m_fntNormal );
	pBuffer->SetBkMode( OPAQUE );
	pBuffer->SetBkColor( CoolInterface.m_crWindow );
	pBuffer->SetTextColor( CoolInterface.m_crText );
	
	m_crRows[0] = CCoolInterface::CalculateColour( CoolInterface.m_crWindow, Skin.m_crSchemaRow[0], 128 );
	m_crRows[1] = CCoolInterface::CalculateColour( CoolInterface.m_crWindow, Skin.m_crSchemaRow[1], 128 );
	
	CRect rcClient, rcTrack;
	GetClientRect( &rcClient );
	
	rcTrack = rcBuffer;
	rcTrack.OffsetRect( rcClient.left, rcClient.top - m_nScroll );
	
	CLibraryAlbumTrack** pList = m_pList;
	
	for ( int nItem = 0 ; nItem < m_nCount && rcTrack.top < rcClient.bottom ; nItem++, pList++ )
	{
		CLibraryAlbumTrack* pTrack = *pList;
		
		if ( rcTrack.bottom >= rcClient.top && dc.RectVisible( &rcTrack ) )
		{
			pBuffer->FillSolidRect( &rcBuffer, CoolInterface.m_crWindow );
			pTrack->Paint( this, pBuffer, rcBuffer, nItem );
			dc.BitBlt( rcTrack.left, rcTrack.top, rcBuffer.right, rcBuffer.bottom,
				pBuffer, 0, 0, SRCCOPY );
			dc.ExcludeClipRect( &rcTrack );
		}
		
		rcTrack.OffsetRect( 0, m_szTrack.cy );
	}
	
	pBuffer->SelectObject( pOldFont );
	dc.FillSolidRect( &rcClient, CoolInterface.m_crWindow );
}

CLibraryAlbumTrack* CLibraryAlbumView::HitTest(const CPoint& point, CRect* pRect) const
{
	CRect rcClient, rcTrack( 0, 0, m_szTrack.cx, m_szTrack.cy );
	GetClientRect( &rcClient );
	rcTrack.OffsetRect( rcClient.left, rcClient.top - m_nScroll );
	
	CLibraryAlbumTrack** pList = m_pList;
	
	for ( int nItem = m_nCount ; nItem && rcTrack.top < rcClient.bottom ; nItem--, pList++ )
	{
		CLibraryAlbumTrack* pTrack = *pList;

		if ( rcTrack.PtInRect( point ) )
		{
			if ( pRect ) *pRect = rcTrack;
			return pTrack;
		}
		
		rcTrack.OffsetRect( 0, m_szTrack.cy );
	}
	
	return NULL;
}

BOOL CLibraryAlbumView::GetItemRect(CLibraryAlbumTrack* pTrack, CRect* pRect)
{
	CRect rcClient, rcTrack( 0, 0, m_szTrack.cx, m_szTrack.cy );
	GetClientRect( &rcClient );
	rcTrack.OffsetRect( rcClient.left, rcClient.top - m_nScroll );
	
	CLibraryAlbumTrack** pList = m_pList;
	
	for ( int nItem = m_nCount ; nItem ; nItem--, pList++ )
	{
		if ( *pList == pTrack )
		{
			*pRect = rcTrack;
			return TRUE;
		}

		rcTrack.OffsetRect( 0, m_szTrack.cy );
	}
	
	return FALSE;
}

void CLibraryAlbumView::OnLButtonDown(UINT nFlags, CPoint point) 
{
	SetFocus();
	SetCapture();
	
	CRect rcTrack;
	CLibraryAlbumTrack* pHit = HitTest( point, &rcTrack );
	
	if ( pHit != NULL && pHit->HitTestRating( rcTrack, point ) )
	{
		pHit->LockRating();
		m_pRating = NULL;
		Invalidate();
		return;
	}
	
	if ( SelectTo( pHit ) ) Invalidate();
	
	if ( pHit && ( nFlags & MK_RBUTTON ) == 0 )
	{
		m_bDrag = TRUE;
		m_ptDrag = point;
	}
	
	CLibraryFileView::OnLButtonDown( nFlags, point );
}

void CLibraryAlbumView::OnMouseMove(UINT nFlags, CPoint point) 
{
	if ( m_bDrag & ( nFlags & MK_LBUTTON ) )
	{
		CSize szDiff = point - m_ptDrag;
		
		if ( abs( szDiff.cx ) > 5 || abs( szDiff.cy ) > 5 )
		{
			m_bDrag = FALSE;
			StartDragging( point );
		}
	}
	
	// CLibraryFileView::OnMouseMove( nFlags, point );	Overridden below!
	
	CLibraryTipCtrl* pTip = &((CLibraryFrame*)GetOwner())->m_wndViewTip;
	CRect rcTrack;
	
	if ( CLibraryAlbumTrack* pTrack = HitTest( point, &rcTrack ) )
	{
		pTip->Show( (LPVOID)pTrack->m_nIndex );
		
		if ( pTrack->HitTestRating( rcTrack, point ) )
		{
			m_pRating = pTrack;
			Invalidate();
			SetCursor( theApp.LoadCursor( IDC_HAND ) );
		}
		else if ( m_pRating != NULL )
		{
			m_pRating = NULL;
			Invalidate();
		}
	}
	else
	{
		pTip->Hide();
		
		if ( m_pRating != NULL )
		{
			m_pRating = NULL;
			Invalidate();
		}
	}
}

void CLibraryAlbumView::OnLButtonUp(UINT nFlags, CPoint point) 
{
	ReleaseCapture();
	m_bDrag = FALSE;
	
	if ( ( nFlags & (MK_SHIFT|MK_CONTROL) ) == 0 && m_pFocus && m_pFocus->m_bSelected )
	{
		if ( DeselectAll( m_pFocus ) ) Invalidate();
	}
}

void CLibraryAlbumView::OnLButtonDblClk(UINT nFlags, CPoint point) 
{
	SendMessage( WM_COMMAND, ID_LIBRARY_LAUNCH );
}

void CLibraryAlbumView::OnRButtonDown(UINT nFlags, CPoint point) 
{
	OnLButtonDown( nFlags, point );
	CLibraryFileView::OnRButtonDown( nFlags, point );
}

void CLibraryAlbumView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	switch ( nChar )
	{
	case VK_LEFT:
	case VK_UP:
		SelectTo( -1 );
		break;
	case VK_DOWN:
	case VK_RIGHT:
		SelectTo( 1 );
		break;
	case VK_PRIOR:
		SelectTo( -m_nRows );
		break;
	case VK_NEXT:
		SelectTo( m_nRows );
		break;
	case VK_HOME:
		SelectTo( -m_nCount );
		break;
	case VK_END:
		SelectTo( m_nCount );
		break;
	default:
		if ( _istalnum( nChar ) )
		{
			CLibraryAlbumTrack* pStart	= m_pFocus;
			
			for ( int nLoop = 0 ; nLoop < 2 ; nLoop++ )
			{
				CLibraryAlbumTrack** pChild = m_pList;
				
				for ( int nCount = m_nCount ; nCount ; nCount--, pChild++ )
				{
					if ( pStart != NULL )
					{
						if ( pStart == *pChild ) pStart = NULL;
					}
					else
					{
						LPCTSTR psz = NULL;
						
						if ( m_pStyle == CSchema::uriMusicAlbum )
							psz = (*pChild)->m_sTitle;
						else if ( m_pStyle == CSchema::uriMusicArtist )
							psz = (*pChild)->m_sAlbum;
						else
							psz = (*pChild)->m_sArtist;
						
						if ( psz && *psz && toupper( *psz ) == (int)nChar )
						{
							if ( SelectTo( *pChild ) ) Invalidate();
							return;
						}
					}
				}
			}
		}
	}
	
	CLibraryFileView::OnKeyDown( nChar, nRepCnt, nFlags );
}

/////////////////////////////////////////////////////////////////////////////
// CLibraryAlbumView drag setup

#define MAX_DRAG_SIZE	256
#define MAX_DRAG_SIZE_2	128

void CLibraryAlbumView::StartDragging(CPoint& ptMouse)
{
	CImageList* pImage = CreateDragImage( ptMouse );
	if ( pImage == NULL ) return;
	
	ReleaseCapture();
	ClientToScreen( &ptMouse );
	DragObjects( pImage, ptMouse );
}

CImageList* CLibraryAlbumView::CreateDragImage(const CPoint& ptMouse)
{
	CRect rcClient, rcOne, rcAll( 32000, 32000, -32000, -32000 );
	
	GetClientRect( &rcClient );
	
	for ( POSITION pos = m_pSelTrack.GetHeadPosition() ; pos ; )
	{
		CLibraryAlbumTrack* pTrack = (CLibraryAlbumTrack*)m_pSelTrack.GetNext( pos );
		GetItemRect( pTrack, &rcOne );
		
		if ( rcOne.IntersectRect( &rcClient, &rcOne ) )
		{
			rcAll.left		= min( rcAll.left, rcOne.left );
			rcAll.top		= min( rcAll.top, rcOne.top );
			rcAll.right		= max( rcAll.right, rcOne.right );
			rcAll.bottom	= max( rcAll.bottom, rcOne.bottom );
		}
	}
	
	BOOL bClipped = rcAll.Height() > MAX_DRAG_SIZE;
	
	if ( bClipped )
	{
		rcAll.left		= max( rcAll.left, ptMouse.x - MAX_DRAG_SIZE_2 );
		rcAll.right		= max( rcAll.right, ptMouse.x + MAX_DRAG_SIZE_2 );
		rcAll.top		= max( rcAll.top, ptMouse.y - MAX_DRAG_SIZE_2 );
		rcAll.bottom	= max( rcAll.bottom, ptMouse.y + MAX_DRAG_SIZE_2 );
	}
	
	CClientDC dcClient( this );
	CBitmap bmDrag;
	CDC dcDrag;
	
	if ( ! dcDrag.CreateCompatibleDC( &dcClient ) )
		return NULL;
	if ( ! bmDrag.CreateCompatibleBitmap( &dcClient, rcAll.Width(), rcAll.Height() ) )
		return NULL;
	
	CBitmap *pOldDrag = dcDrag.SelectObject( &bmDrag );
	
	dcDrag.FillSolidRect( 0, 0, rcAll.Width(), rcAll.Height(), RGB( 0, 255, 0 ) );
	
	CRgn pRgn;
	
	if ( bClipped )
	{
		CPoint ptMiddle( ptMouse.x - rcAll.left, ptMouse.y - rcAll.top );
		pRgn.CreateEllipticRgn(	ptMiddle.x - MAX_DRAG_SIZE_2, ptMiddle.y - MAX_DRAG_SIZE_2,
								ptMiddle.x + MAX_DRAG_SIZE_2, ptMiddle.y + MAX_DRAG_SIZE_2 );
		dcDrag.SelectClipRgn( &pRgn );
	}
	
	CDC* pBuffer = CoolInterface.GetBuffer( dcClient, m_szTrack );
	CRect rcBuffer( 0, 0, m_szTrack.cx, m_szTrack.cy );
	
	CFont* pOldFont = (CFont*)pBuffer->SelectObject( &CoolInterface.m_fntNormal );
	
	for ( pos = m_pSelTrack.GetHeadPosition() ; pos ; )
	{
		CLibraryAlbumTrack* pTrack = (CLibraryAlbumTrack*)m_pSelTrack.GetNext( pos );
		GetItemRect( pTrack, &rcOne );
		CRect rcDummy;
		
		if ( rcDummy.IntersectRect( &rcAll, &rcOne ) )
		{
			pBuffer->FillSolidRect( &rcBuffer, RGB( 0, 255, 0 ) );
			pTrack->Paint( this, pBuffer, rcBuffer, -1 );
			dcDrag.BitBlt( rcOne.left - rcAll.left, rcOne.top - rcAll.top,
				m_szTrack.cx, m_szTrack.cy, pBuffer, 0, 0, SRCCOPY );
		}
	}
	
	pBuffer->SelectObject( pOldFont );
	dcDrag.SelectObject( pOldDrag );
	dcDrag.DeleteDC();
	
	CImageList* pAll = new CImageList();
	pAll->Create( rcAll.Width(), rcAll.Height(), ILC_COLOR16|ILC_MASK, 1, 1 );
	pAll->Add( &bmDrag, RGB( 0, 255, 0 ) ); 
	
	bmDrag.DeleteObject();
	
	pAll->BeginDrag( 0, ptMouse - rcAll.TopLeft() );
	
	return pAll;
}


/////////////////////////////////////////////////////////////////////////////
// CLibraryAlbumTrack construction

CLibraryAlbumTrack::CLibraryAlbumTrack(CLibraryFile* pFile)
{
	m_nIndex	= pFile->m_nIndex;
	m_nCookie	= pFile->m_nUpdateCookie - 1;
	m_bSelected	= FALSE;
	
	Update( pFile );
}

CLibraryAlbumTrack::~CLibraryAlbumTrack()
{
}

/////////////////////////////////////////////////////////////////////////////
// CLibraryAlbumTrack operations

BOOL CLibraryAlbumTrack::Update(CLibraryFile* pFile)
{
	BOOL bShared = pFile->IsShared();
	
	if ( m_nCookie == pFile->m_nUpdateCookie && m_bShared == bShared ) return FALSE;
	
	m_nCookie	= pFile->m_nUpdateCookie;
	m_bShared	= bShared;
	m_nShell	= ShellIcons.Get( pFile->m_sName, 16 );
	m_nRating	= pFile->m_nRating;
	m_bComments	= pFile->m_sComments.GetLength() > 0;
	m_nTrack	= 0;
	m_sTrack.Empty();
	m_sTitle.Empty();
	m_sArtist.Empty();
	m_sAlbum.Empty();
	m_nLength	= 0;
	m_sLength.Empty();
	m_nBitrate	= 0;
	m_sBitrate.Empty();
	
	if ( pFile->IsSchemaURI( CSchema::uriAudio ) )
	{
		CString str = pFile->m_pMetadata->GetAttributeValue( _T("track") );
		LPCTSTR psz = str;

		while ( *psz == '0' ) psz++;
		if ( *psz ) _stscanf( psz, _T("%i"), &m_nTrack );
		
		m_sTitle	= pFile->m_pMetadata->GetAttributeValue( _T("title") );
		m_sArtist	= pFile->m_pMetadata->GetAttributeValue( _T("artist") );
		m_sAlbum	= pFile->m_pMetadata->GetAttributeValue( _T("album") );
		
		_stscanf( pFile->m_pMetadata->GetAttributeValue( _T("seconds") ), _T("%i"), &m_nLength );
		_stscanf( pFile->m_pMetadata->GetAttributeValue( _T("bitrate") ), _T("%i"), &m_nBitrate );
	}
	
	int nDash = pFile->m_sName.Find( '-' );
	
	if ( nDash > 0 )
	{
		if ( m_sArtist.IsEmpty() ) m_sArtist = pFile->m_sName.Left( nDash );
		nDash = pFile->m_sName.ReverseFind( '-' );
		if ( m_sTitle.IsEmpty() )
		{
			m_sTitle = pFile->m_sName.Mid( nDash + 1 );
			nDash = m_sTitle.ReverseFind( '.' );
			if ( nDash >= 0 ) m_sTitle = m_sTitle.Left( nDash );
		}
	}
	else if ( m_sTitle.IsEmpty() )
	{
		m_sTitle = pFile->m_sName;
		nDash = m_sTitle.ReverseFind( '.' );
		if ( nDash >= 0 ) m_sTitle = m_sTitle.Left( nDash );
	}
	
	m_sTitle.TrimLeft();
	m_sTitle.TrimRight();
	m_sArtist.TrimLeft();
	m_sArtist.TrimRight();
	m_sAlbum.TrimLeft();
	m_sAlbum.TrimRight();
	
	if ( m_nTrack > 0 )
	{
		m_sTrack.Format( _T("%i"), m_nTrack );
	}
	
	if ( m_nLength > 0 )
	{
		m_sLength.Format( _T("%i:%.2i"), m_nLength / 60, m_nLength % 60 );
	}
	
	if ( m_nBitrate > 0 )
	{
		m_sBitrate.Format( _T("%ik"), m_nBitrate );
	}
	
	return TRUE;
}

/////////////////////////////////////////////////////////////////////////////
// CLibraryAlbumTrack paint

void CLibraryAlbumTrack::Paint(CLibraryAlbumView* pView, CDC* pDC, const CRect& rcTrack, int nCount)
{
	COLORREF crBack1 = CLibraryAlbumView::m_crRows[ nCount & 1 ];
	COLORREF crBack2 = m_bSelected ? CoolInterface.m_crHighlight : crBack1;
	
	CRect rcLine( &rcTrack );
	rcLine.DeflateRect( 1, 1 );
	rcLine.left ++; rcLine.right --;
	
	CRect rcTemp( rcLine.left, rcLine.top, rcLine.left + 22, rcLine.bottom );
	rcLine.left += 22;
	
	pDC->SetBkColor( crBack1 );
	if ( nCount >= 0 ) PaintText( pDC, rcTemp, 0, 100, NULL );
	if ( m_bSelected ) pDC->SetBkColor( crBack2 );
	
	ShellIcons.Draw( pDC, m_nShell, 16, rcTemp.left + 3,
		( rcTemp.top + rcTemp.bottom ) / 2 - 8, CLR_NONE, m_bSelected );
	
	pDC->SetTextColor( m_bSelected ? CoolInterface.m_crHiText : CoolInterface.m_crText );
	
	rcTemp.SetRect( rcLine.right - 78, rcLine.top, rcLine.right, rcLine.bottom );
	rcLine.right -= 78;
	
	CPoint ptStar( rcTemp.left + 3, ( rcTemp.top + rcTemp.bottom ) / 2 - 6 );
	PaintText( pDC, rcTemp, 0, 100, NULL );
	
	if ( pView->m_pRating == this && m_nSetRating < 7 )
	{
		for ( int nRating = 2 ; nRating <= 6 ; nRating++ )
		{
			ImageList_DrawEx( pView->m_pStars, m_nSetRating >= nRating ? 2 : 1,
				*pDC, ptStar.x, ptStar.y, 12, 12, crBack2, crBack2,
				m_nSetRating >= nRating ? ILD_NORMAL : ILD_BLEND50 );
			ptStar.x += 12;
		}
	}
	else
	{
		for ( int nRating = 2 ; nRating <= 6 ; nRating++ )
		{
			ImageList_DrawEx( pView->m_pStars, m_nRating >= nRating ? 0 : 1,
				*pDC, ptStar.x, ptStar.y, 12, 12, crBack2, crBack2,
				m_nRating >= nRating ? ILD_NORMAL : ILD_BLEND50 );
			ptStar.x += 12;
		}
	}
	
	if ( pView->m_pRating == this && m_nSetRating == 7 )
	{
		ImageList_DrawEx( pView->m_pStars, 5,
			*pDC, ptStar.x, ptStar.y, 12, 12, crBack2, crBack2, ILD_NORMAL );
	}
	else
	{
		ImageList_DrawEx( pView->m_pStars, m_bComments ? 3 : 4,
			*pDC, ptStar.x, ptStar.y, 12, 12, crBack2, crBack2,
			m_bComments ? ILD_NORMAL : ILD_BLEND50 );
	}
	
	if ( pView->m_pStyle == CSchema::uriMusicAlbum )
	{
		// Track, Title, Length, Bitrate
		PaintText( pDC, rcLine, 0, 5, &m_sTrack, TRUE );
		PaintText( pDC, rcLine, 5, 84, &m_sTitle );
		PaintText( pDC, rcLine, 84, 92, &m_sLength, TRUE );
		PaintText( pDC, rcLine, 92, 100, &m_sBitrate, TRUE );
	}
	else if ( pView->m_pStyle == CSchema::uriMusicArtist )
	{
		// Album, Title, Length, Bitrate
		PaintText( pDC, rcLine, 0, 30, &m_sAlbum );
		PaintText( pDC, rcLine, 30, 84, &m_sTitle );
		PaintText( pDC, rcLine, 84, 92, &m_sLength, TRUE );
		PaintText( pDC, rcLine, 92, 100, &m_sBitrate, TRUE );
	}
	else
	{
		// Artist, Album, Title, Length, Bitrate
		PaintText( pDC, rcLine, 0, 25, &m_sArtist );
		PaintText( pDC, rcLine, 25, 50, &m_sAlbum );
		PaintText( pDC, rcLine, 50, 84, &m_sTitle );
		PaintText( pDC, rcLine, 84, 92, &m_sLength, TRUE );
		PaintText( pDC, rcLine, 92, 100, &m_sBitrate, TRUE );
	}
}

void CLibraryAlbumTrack::PaintText(CDC* pDC, const CRect& rcTrack, int nFrom, int nTo, const CString* pstr, BOOL bCenter)
{
	CRect rcText;
	
	rcText.left		= rcTrack.left + rcTrack.Width() * nFrom / 100 + 1;
	rcText.right	= rcTrack.left + rcTrack.Width() * nTo / 100 - 1;
	rcText.top		= rcTrack.top;
	rcText.bottom	= rcTrack.bottom;
	
	COLORREF crOld = pDC->GetPixel( rcText.left, rcText.top );
	
	if ( pstr != NULL )
	{
		if ( bCenter || pstr->GetLength() )
		{
			CSize szText = pDC->GetTextExtent( *pstr );
			int nText = pstr->GetLength();
			
			if ( szText.cx + 8 > rcText.Width() )
			{
				while ( nText > 0 )
				{
					nText--;
					szText = pDC->GetTextExtent( *pstr, nText );
					szText.cx += 8;
					if ( szText.cx + 8 <= rcText.Width() ) break;
				}
				
				CString str = pstr->Left( nText ) + _T('

⌨️ 快捷键说明

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