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

📄 ctrldownloadtabbar.cpp

📁 著名的下载软件核心Shareaza
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	else if ( m_bTimer && ! m_pHot )
	{
		KillTimer( 1 );
		m_bTimer = FALSE;
	}
	
	CControlBar::OnMouseMove( nFlags, point );
}

void CDownloadTabBar::OnTimer(UINT nIDEvent) 
{
	if ( nIDEvent == 1 )
	{
		CRect rcWindow;
		CPoint point;
		
		GetClientRect( &rcWindow );
		ClientToScreen( &rcWindow );
		GetCursorPos( &point );
		
		if ( ! rcWindow.PtInRect( point ) )
		{
			KillTimer( nIDEvent );
			m_pHot		= NULL;
			m_bTimer	= FALSE;
			Invalidate();
		}
	}
	
	CControlBar::OnTimer( nIDEvent );
}

void CDownloadTabBar::OnLButtonDown(UINT nFlags, CPoint point) 
{
	if ( TabItem* pHit = HitTest( point ) )
	{
		BOOL bShift		= ( nFlags & MK_SHIFT ) != 0;
		BOOL bControl	= ( nFlags & MK_CONTROL ) != 0;
		BOOL bChanged	= FALSE;
		
		if ( bControl )
		{
			bChanged |= pHit->Select( ! pHit->m_bSelected );
		}
		else if ( bShift )
		{
			bChanged |= pHit->Select( TRUE );
		}
		else
		{
			bChanged |= Select( pHit );
		}
		
		if ( bChanged ) NotifySelection();
		
		return;
	}
	
	CControlBar::OnLButtonDown( nFlags, point );
}

void CDownloadTabBar::OnLButtonDblClk(UINT nFlags, CPoint point) 
{
	if ( TabItem* pHit = HitTest( point ) )
	{
		PostMessage( WM_COMMAND, ID_DOWNLOAD_GROUP_PROPERTIES );
		return;
	}
	
	OnLButtonDown( nFlags, point );
}

void CDownloadTabBar::OnRButtonUp(UINT nFlags, CPoint point) 
{
	CRect rcItem;
	
	if ( TabItem* pItem = HitTest( point, &rcItem ) )
	{
		m_bMenuGray = TRUE;
		if ( Select( pItem ) ) NotifySelection();
		Invalidate();
		ClientToScreen( &rcItem );
		CoolMenu.RegisterEdge( rcItem.left, rcItem.bottom - 1, rcItem.Width() );
		Skin.TrackPopupMenu( _T("CDownloadTabBar"), CPoint( rcItem.left, rcItem.bottom - 1 ), ID_DOWNLOAD_GROUP_PROPERTIES );
		m_bMenuGray = FALSE;
		Invalidate();
		return;
	}
	else
	{
		ClientToScreen( &point );
		Skin.TrackPopupMenu( _T("CDownloadTabBar"), point );
		return;
	}
	
	CControlBar::OnRButtonUp( nFlags, point );
}

void CDownloadTabBar::OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct) 
{
	CoolMenu.OnMeasureItem( lpMeasureItemStruct );
}

void CDownloadTabBar::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct) 
{
	CoolMenu.OnDrawItem( lpDrawItemStruct );
}

BOOL CDownloadTabBar::Select(TabItem* pHit)
{
	BOOL bChanged = FALSE;
	
	for ( POSITION pos = m_pItems.GetHeadPosition() ; pos ; )
	{
		TabItem* pItem = (TabItem*)m_pItems.GetNext( pos );
		bChanged |= pItem->Select( pItem == pHit );
	}
	
	return bChanged;
}

int CDownloadTabBar::GetSelectedCount(BOOL bDownloads)
{
	int nCount = 0;
	
	for ( POSITION pos = m_pItems.GetHeadPosition() ; pos ; )
	{
		TabItem* pItem = (TabItem*)m_pItems.GetNext( pos );
		
		if ( pItem->m_bSelected )
		{
			nCount += bDownloads ? pItem->m_nCount : 1;
		}
	}
	
	return nCount;
}

CDownloadTabBar::TabItem* CDownloadTabBar::GetSelectedItem()
{
	TabItem* pSelected = NULL;
	
	for ( POSITION pos = m_pItems.GetHeadPosition() ; pos ; )
	{
		TabItem* pItem = (TabItem*)m_pItems.GetNext( pos );
		
		if ( pItem->m_bSelected )
		{
			if ( pSelected == NULL )
				pSelected = pItem;
			else
				return NULL;
		}
	}
	
	return pSelected;
}

CDownloadGroup* CDownloadTabBar::GetSelectedGroup()
{
	TabItem* pItem = GetSelectedItem();
	return pItem ? pItem->m_pGroup : NULL;
}

void CDownloadTabBar::GetSelectedDownloads(CPtrList* pDownloads)
{
	CSingleLock pLock( &DownloadGroups.m_pSection, TRUE );
	
	for ( POSITION pos = m_pItems.GetHeadPosition() ; pos ; )
	{
		TabItem* pItem = (TabItem*)m_pItems.GetNext( pos );
		
		if ( pItem->m_bSelected && DownloadGroups.Check( pItem->m_pGroup ) )
		{
			pItem->m_pGroup->CopyList( pDownloads );
		}
	}
}

void CDownloadTabBar::NotifySelection()
{
	Invalidate();
	GetOwner()->PostMessage( WM_TIMER, 3 );
}


/////////////////////////////////////////////////////////////////////////////
// CDownloadTabBar::TabItem construction

CDownloadTabBar::TabItem::TabItem(CDownloadGroup* pGroup, int nCookie)
{
	m_pGroup	= pGroup;
	m_nImage	= 0;
	m_bSelected	= ( m_pGroup == DownloadGroups.GetSuperGroup() );
	
	Update( nCookie );
}

CDownloadTabBar::TabItem::~TabItem()
{
}

/////////////////////////////////////////////////////////////////////////////
// CDownloadTabBar::TabItem update

BOOL CDownloadTabBar::TabItem::Update(int nCookie)
{
	if ( m_bSelected && nCookie ) m_pGroup->SetCookie( nCookie );
	
	BOOL bChanged = FALSE;
	
	if ( m_sName != m_pGroup->m_sName )
	{
		m_sName = m_pGroup->m_sName;
		bChanged = TRUE;
	}
	
	BOOL nCount = m_pGroup->GetCount();
	
	if ( m_nCount != nCount )
	{
		m_nCount = nCount;
		bChanged = TRUE;
	}
	
	if ( m_nImage != m_pGroup->m_nImage )
	{
		m_nImage = m_pGroup->m_nImage;
		bChanged = TRUE;
	}
	
	if ( bChanged )
	{
		m_sCaption.Format( _T("%s (%i)"), (LPCTSTR)m_sName, m_nCount );
	}
	
	return bChanged;
}

/////////////////////////////////////////////////////////////////////////////
// CDownloadTabBar::TabItem select

BOOL CDownloadTabBar::TabItem::Select(BOOL bSelect)
{
	if ( bSelect == m_bSelected ) return FALSE;
	m_bSelected = bSelect;
	return TRUE;
}

/////////////////////////////////////////////////////////////////////////////
// CDownloadTabBar::TabItem paint

void CDownloadTabBar::TabItem::Paint(CDownloadTabBar* pBar, CDC* pDC, CRect* pRect, BOOL bHot, BOOL bTransparent)
{
	CRect rc( pRect );
	COLORREF crBack;
	
	BOOL bPopulated = m_nCount > 0;
	
	if ( m_bSelected && pBar->m_bMenuGray )
	{
		crBack = CoolInterface.m_crBackNormal;
		pDC->Draw3dRect( &rc, CoolInterface.m_crDisabled, CoolInterface.m_crDisabled );
	}
	else if ( bHot || m_bSelected )
	{
		crBack = ( bHot && m_bSelected ) ? CoolInterface.m_crBackCheckSel : CoolInterface.m_crBackSel;
		pDC->Draw3dRect( &rc, CoolInterface.m_crBorder, CoolInterface.m_crBorder );
	}
	else
	{
		crBack = bTransparent ? CLR_NONE : CoolInterface.m_crMidtone;
		if ( crBack != CLR_NONE ) pDC->Draw3dRect( &rc, crBack, crBack );
	}
	
	rc.DeflateRect( 1, 1 );
	if ( crBack != CLR_NONE ) pDC->SetBkColor( crBack );
	
	CPoint ptImage( rc.left + 2, rc.top + 1 );
	
	if ( m_bSelected )
	{
		ImageList_DrawEx( ShellIcons.GetHandle( 16 ), m_nImage, pDC->GetSafeHdc(),
			ptImage.x, ptImage.y, 0, 0, crBack, CLR_NONE, ILD_NORMAL );
		pDC->ExcludeClipRect( ptImage.x, ptImage.y, ptImage.x + 16, ptImage.y + 16 );
	}
	else if ( bHot )
	{
		ptImage.Offset( -1, -1 );
		
		if ( crBack != CLR_NONE )
		{
			pDC->FillSolidRect( ptImage.x, ptImage.y, 18, 2, crBack );
			pDC->FillSolidRect( ptImage.x, ptImage.y + 2, 2, 16, crBack );
		}
		
		ptImage.Offset( 2, 2 );
		pDC->SetTextColor( CoolInterface.m_crShadow );
		ImageList_DrawEx( ShellIcons.GetHandle( 16 ), m_nImage, pDC->GetSafeHdc(),
			ptImage.x, ptImage.y, 0, 0, crBack, CLR_NONE, ILD_MASK );
		
		ptImage.Offset( -2, -2 );
		ImageList_DrawEx( ShellIcons.GetHandle( 16 ), m_nImage, pDC->GetSafeHdc(),
			ptImage.x, ptImage.y, 0, 0, CLR_NONE, CLR_NONE, ILD_NORMAL );
		
		pDC->ExcludeClipRect( ptImage.x, ptImage.y, ptImage.x + 18, ptImage.y + 18 );
		
		ptImage.Offset( 1, 1 );
	}
	else
	{
		ImageList_DrawEx( ShellIcons.GetHandle( 16 ), m_nImage, pDC->GetSafeHdc(),
			ptImage.x, ptImage.y, 0, 0, crBack, CoolInterface.m_crShadow, ILD_BLEND50 );
		pDC->ExcludeClipRect( ptImage.x, ptImage.y, ptImage.x + 16, ptImage.y + 16 );
	}
	
	rc.left += 20;
	
	CString strText = m_sCaption;
	
	if ( pDC->GetTextExtent( strText ).cx > rc.Width() )
	{
		while ( pDC->GetTextExtent( strText + _T("

⌨️ 快捷键说明

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