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

📄 ctrlmedialist.cpp

📁 著名的下载软件核心Shareaza
💻 CPP
📖 第 1 页 / 共 2 页
字号:
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 + -