📄 ctrlmedialist.cpp
字号:
void CMediaListCtrl::OnCustomDraw(NMLVCUSTOMDRAW* pNotify, LRESULT* pResult)
{
if ( pNotify->nmcd.dwDrawStage == CDDS_PREPAINT )
{
*pResult = CDRF_NOTIFYITEMDRAW;
}
else if ( pNotify->nmcd.dwDrawStage == CDDS_ITEMPREPAINT )
{
if ( GetItemState( pNotify->nmcd.dwItemSpec, LVIS_SELECTED ) == 0 &&
GetItemState( pNotify->nmcd.dwItemSpec, STATE_CURRENT ) != 0 )
{
pNotify->clrText = RGB( 255, 255, 255 );
pNotify->clrTextBk = RGB( 128, 0, 0 );
}
else
{
pNotify->clrText = RGB( 255, 255, 255 );
pNotify->clrTextBk = RGB( 0, 0, 0x30 );
}
if ( m_bCreateDragImage ) pNotify->clrTextBk = RGB( 0, 255, 0 );
*pResult = CDRF_DODEFAULT;
}
else
{
*pResult = 0;
}
}
void CMediaListCtrl::OnDoubleClick(NMHDR* pNMHDR, LRESULT* pResult)
{
OnMediaSelect();
*pResult = 0;
}
void CMediaListCtrl::OnContextMenu(CWnd* pWnd, CPoint point)
{
Skin.TrackPopupMenu( _T("CMediaList"), point, ID_MEDIA_SELECT );
}
void CMediaListCtrl::OnKeyDown(NMHDR* pNMHDR, LRESULT* pResult)
{
LV_KEYDOWN* pLVKeyDow = (LV_KEYDOWN*)pNMHDR;
if ( pLVKeyDow->wVKey == VK_RETURN )
PostMessage( WM_COMMAND, ID_MEDIA_SELECT );
else if ( pLVKeyDow->wVKey == VK_DELETE )
PostMessage( WM_COMMAND, ID_MEDIA_REMOVE );
m_wndTip.Hide();
*pResult = 0;
}
void CMediaListCtrl::OnBeginDrag(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
*pResult = 0;
m_wndTip.Hide();
CPoint ptAction( pNMListView->ptAction );
m_bCreateDragImage = TRUE;
m_pDragImage = CLiveList::CreateDragImage( this, ptAction );
m_bCreateDragImage = FALSE;
if ( m_pDragImage == NULL ) return;
m_nDragDrop = -1;
UpdateWindow();
CRect rcClient;
GetClientRect( &rcClient );
ClientToScreen( &rcClient );
ClipCursor( &rcClient );
SetCapture();
SetFocus();
UpdateWindow();
m_pDragImage->DragEnter( this, ptAction );
}
void CMediaListCtrl::OnLButtonDown(UINT nFlags, CPoint point)
{
m_wndTip.Hide();
CListCtrl::OnLButtonDown( nFlags, point );
}
void CMediaListCtrl::OnRButtonDown(UINT nFlags, CPoint point)
{
m_wndTip.Hide();
CListCtrl::OnRButtonDown( nFlags, point );
}
void CMediaListCtrl::OnMouseMove(UINT nFlags, CPoint point)
{
int nHit = HitTest( point );
if ( m_pDragImage != NULL )
{
m_pDragImage->DragMove( point );
if ( nHit != m_nDragDrop )
{
CImageList::DragShowNolock( FALSE );
if ( m_nDragDrop >= 0 ) SetItemState( m_nDragDrop, 0, LVIS_DROPHILITED );
m_nDragDrop = nHit;
if ( m_nDragDrop >= 0 ) SetItemState( m_nDragDrop, LVIS_DROPHILITED, LVIS_DROPHILITED );
UpdateWindow();
CImageList::DragShowNolock( TRUE );
}
}
else
{
DWORD nFile = nHit >= 0 ? GetItemData( nHit ) : 0;
if ( nFile > 0 && ! Library.LookupFile( nFile ) ) nFile = 0;
if ( nFile > 0 )
{
m_wndTip.Show( (LPVOID)nFile );
}
else
{
m_wndTip.Hide();
}
}
CListCtrl::OnMouseMove( nFlags, point );
}
void CMediaListCtrl::OnLButtonUp(UINT nFlags, CPoint point)
{
if ( m_pDragImage == NULL )
{
CListCtrl::OnLButtonUp( nFlags, point );
return;
}
ClipCursor( NULL );
ReleaseCapture();
m_pDragImage->DragLeave( this );
m_pDragImage->EndDrag();
delete m_pDragImage;
m_pDragImage = NULL;
if ( m_nDragDrop >= 0 )
SetItemState( m_nDragDrop, 0, LVIS_DROPHILITED );
else
m_nDragDrop = GetItemCount();
CStringArray pPaths;
CPtrArray pStates;
while ( TRUE )
{
int nItem = GetNextItem( -1, LVNI_SELECTED );
if ( nItem < 0 ) break;
pPaths.Add( GetItemText( nItem, 1 ) );
pStates.Add( (LPVOID)GetItemState( nItem, 0xFFFFFFFF ) );
DeleteItem( nItem );
if ( m_nDragDrop > nItem ) m_nDragDrop --;
}
for ( int nItem = 0 ; nItem < pPaths.GetSize() ; nItem++ )
{
int nIndex = Add( pPaths.GetAt( nItem ), m_nDragDrop++ );
SetItemState( nIndex, (DWORD)pStates.GetAt( nItem ), 0xFFFFFFFF );
}
}
/////////////////////////////////////////////////////////////////////////////
// CMediaListCtrl command handlers
void CMediaListCtrl::OnUpdateMediaSelect(CCmdUI* pCmdUI)
{
pCmdUI->Enable( GetSelectedCount() == 1 );
}
void CMediaListCtrl::OnMediaSelect()
{
int nItem = GetNextItem( -1, LVNI_SELECTED );
if ( nItem >= 0 )
{
SetCurrent( nItem );
SetFocus();
Invalidate();
}
}
void CMediaListCtrl::OnMediaAdd()
{
if ( ! AfxGetMainWnd()->IsWindowEnabled() ) return;
CString strFilter;
Skin.LoadString( strFilter, IDS_MEDIA_FILTER );
CFileDialog dlg( TRUE, NULL, NULL,
OFN_HIDEREADONLY|OFN_ALLOWMULTISELECT|OFN_ENABLESIZING,
strFilter, this );
TCHAR szFiles[81920];
dlg.m_ofn.lpstrFile = szFiles;
dlg.m_ofn.nMaxFile = 81920;
if ( dlg.DoModal() != IDOK ) return;
CString strFolder = CString( szFiles );
LPCTSTR pszFile = szFiles + strFolder.GetLength() + 1;
BOOL bWasEmpty = ( GetItemCount() == 0 );
if ( *pszFile )
{
for ( strFolder += '\\' ; *pszFile ; )
{
Enqueue( strFolder + pszFile, FALSE );
pszFile += _tcslen( pszFile ) + 1;
}
}
else
{
Enqueue( strFolder, FALSE );
}
if ( GetItemCount() > 0 && bWasEmpty ) GetNext();
}
void CMediaListCtrl::OnMediaAddFolder()
{
if ( ! AfxGetMainWnd()->IsWindowEnabled() ) return;
TCHAR szPath[MAX_PATH];
LPITEMIDLIST pPath;
LPMALLOC pMalloc;
BROWSEINFO pBI;
ZeroMemory( &pBI, sizeof(pBI) );
pBI.hwndOwner = AfxGetMainWnd()->GetSafeHwnd();
pBI.pszDisplayName = szPath;
pBI.lpszTitle = _T("Select folder to share:");
pBI.ulFlags = BIF_RETURNONLYFSDIRS;
pPath = SHBrowseForFolder( &pBI );
if ( pPath == NULL ) return;
SHGetPathFromIDList( pPath, szPath );
SHGetMalloc( &pMalloc );
pMalloc->Free( pPath );
BOOL bWasEmpty = ( GetItemCount() == 0 );
RecursiveEnqueue( szPath );
if ( GetItemCount() > 0 && bWasEmpty ) GetNext();
}
void CMediaListCtrl::OnUpdateMediaRemove(CCmdUI* pCmdUI)
{
pCmdUI->Enable( GetSelectedCount() > 0 );
}
void CMediaListCtrl::OnMediaRemove()
{
for ( int nItem = GetItemCount() - 1 ; nItem >= 0 ; nItem-- )
{
if ( GetItemState( nItem, LVIS_SELECTED ) ) Remove( nItem );
}
}
void CMediaListCtrl::OnUpdateMediaClear(CCmdUI* pCmdUI)
{
pCmdUI->Enable( GetItemCount() > 0 );
}
void CMediaListCtrl::OnMediaClear()
{
Clear();
}
void CMediaListCtrl::OnMediaOpen()
{
CString strFilter;
Skin.LoadString( strFilter, IDS_MEDIA_FILTER );
CFileDialog dlg( TRUE, NULL, NULL, OFN_HIDEREADONLY|OFN_ENABLESIZING, strFilter, this );
if ( dlg.DoModal() != IDOK ) return;
Open( dlg.GetPathName() );
}
void CMediaListCtrl::OnUpdateMediaSave(CCmdUI* pCmdUI)
{
pCmdUI->Enable( GetItemCount() > 0 );
}
void CMediaListCtrl::OnMediaSave()
{
CFileDialog dlg( FALSE, _T("m3u"), NULL, OFN_HIDEREADONLY|OFN_ENABLESIZING,
_T("Media Playlists|*.m3u|All Files|*.*||"), this );
if ( dlg.DoModal() != IDOK ) return;
CString strFile, strPath;
CFile pFile;
strPath = dlg.GetPathName();
strPath = strPath.Left( strPath.ReverseFind( '\\' ) + 1 );
for ( int nItem = 0 ; nItem < GetItemCount() ; nItem++ )
{
CString strItem = GetItemText( nItem, 1 );
if ( _tcsnicmp( strPath, strItem, strPath.GetLength() ) == 0 )
strItem = strItem.Mid( strPath.GetLength() );
strFile += strItem + _T("\r\n");
}
if ( ! pFile.Open( dlg.GetPathName(), CFile::modeWrite|CFile::modeCreate ) ) return;
USES_CONVERSION;
LPCSTR pszFile = T2CA( (LPCTSTR)strFile );
pFile.Write( pszFile, strlen(pszFile) );
pFile.Close();
}
void CMediaListCtrl::OnUpdateMediaPrevious(CCmdUI* pCmdUI)
{
pCmdUI->Enable( GetCurrent() > 0 );
}
void CMediaListCtrl::OnMediaPrevious()
{
int nCurrent = GetCurrent();
if ( nCurrent > 0 ) SetCurrent( nCurrent - 1 );
}
void CMediaListCtrl::OnUpdateMediaNext(CCmdUI* pCmdUI)
{
pCmdUI->Enable( GetItemCount() > 1 );
}
void CMediaListCtrl::OnMediaNext()
{
GetNext();
}
void CMediaListCtrl::OnUpdateMediaRepeat(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck( Settings.MediaPlayer.Repeat );
}
void CMediaListCtrl::OnMediaRepeat()
{
Settings.MediaPlayer.Repeat = ! Settings.MediaPlayer.Repeat;
}
void CMediaListCtrl::OnUpdateMediaRandom(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck( Settings.MediaPlayer.Random );
}
void CMediaListCtrl::OnMediaRandom()
{
Settings.MediaPlayer.Random = ! Settings.MediaPlayer.Random;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -