📄 ctrllibraryalbumview.cpp
字号:
}
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 + -