HBITMAP CLibraryAlbumView::CreateDragImage(const CPoint& ptMouse, CPoint& ptMiddle) { CRect rcClient, rcOne, rcAll( 32000, 32000, -32000, -32000 ); GetClientRect( &rcClient ); for ( POSITION pos = m_pSelTrack.GetHeadPosition() ; pos ; ) { CLibraryAlbumTrack* pTrack = 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(), DRAG_COLOR_KEY ); CRgn pRgn; ptMiddle.SetPoint( ptMouse.x - rcAll.left, ptMouse.y - rcAll.top ); if ( bClipped ) { 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 ( POSITION pos = m_pSelTrack.GetHeadPosition() ; pos ; ) { CLibraryAlbumTrack* pTrack = m_pSelTrack.GetNext( pos ); GetItemRect( pTrack, &rcOne ); CRect rcDummy; if ( rcDummy.IntersectRect( &rcAll, &rcOne ) ) { pBuffer->FillSolidRect( &rcBuffer, DRAG_COLOR_KEY ); 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(); return (HBITMAP) bmDrag.Detach(); }
HBITMAP CLiveList::CreateDragImage(CListCtrl* pList, const CPoint& ptMouse, CPoint& ptMiddle) { ASSERT_VALID( pList ); CRect rcClient, rcOne, rcAll( 32000, 32000, -32000, -32000 ); int nIndex; if ( pList->GetSelectedCount() == 0 ) return NULL; pList->SetFocus(); pList->GetClientRect( &rcClient ); for ( nIndex = -1 ; ( nIndex = pList->GetNextItem( nIndex, LVNI_SELECTED ) ) >= 0 ; ) { pList->GetItemRect( nIndex, rcOne, LVIR_BOUNDS ); 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 ); } pList->SetItemState( nIndex, 0, LVIS_FOCUSED ); } 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( pList ); CBitmap bmAll, bmDrag; CDC dcAll, dcDrag; if ( ! dcAll.CreateCompatibleDC( &dcClient ) ) return NULL; if ( ! bmAll.CreateCompatibleBitmap( &dcClient, rcClient.Width(), rcClient.Height() ) ) return NULL; if ( ! dcDrag.CreateCompatibleDC( &dcClient ) ) return NULL; if ( ! bmDrag.CreateCompatibleBitmap( &dcClient, rcAll.Width(), rcAll.Height() ) ) return NULL; CBitmap *pOldAll = dcAll.SelectObject( &bmAll ); dcAll.FillSolidRect( &rcClient, DRAG_COLOR_KEY ); COLORREF crBack = pList->GetBkColor(); pList->SetBkColor( DRAG_COLOR_KEY ); pList->SendMessage( WM_PAINT, (WPARAM)dcAll.GetSafeHdc() ); pList->SetBkColor( crBack ); CBitmap *pOldDrag = dcDrag.SelectObject( &bmDrag ); dcDrag.FillSolidRect( 0, 0, rcAll.Width(), rcAll.Height(), DRAG_COLOR_KEY ); CRgn pRgn; ptMiddle.SetPoint( ptMouse.x - rcAll.left, ptMouse.y - rcAll.top ); if ( bClipped ) { 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 ); } for ( nIndex = -1 ; ( nIndex = pList->GetNextItem( nIndex, LVNI_SELECTED ) ) >= 0 ; ) { pList->GetItemRect( nIndex, rcOne, LVIR_BOUNDS ); if ( rcOne.IntersectRect( &rcAll, &rcOne ) ) { dcDrag.BitBlt( rcOne.left - rcAll.left, rcOne.top - rcAll.top, rcOne.Width(), rcOne.Height(), &dcAll, rcOne.left, rcOne.top, SRCCOPY ); } } dcDrag.SelectObject( pOldDrag ); dcAll.SelectObject( pOldAll ); dcDrag.DeleteDC(); bmAll.DeleteObject(); dcAll.DeleteDC(); return (HBITMAP) bmDrag.Detach (); }
HBITMAP CLibraryTileView::CreateDragImage(const CPoint& ptMouse, CPoint& ptMiddle) { ASSUME_LOCK( Library.m_pSection ); CRect rcClient, rcOne, rcAll( 32000, 32000, -32000, -32000 ); GetClientRect( &rcClient ); for ( std::list< iterator >::iterator pTile = m_oSelTile.begin(); pTile != m_oSelTile.end(); ++pTile ) { GetItemRect( *pTile, &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 ); } } const 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 ); CDC dcMem, dcDrag; CBitmap bmDrag; if ( ! dcMem.CreateCompatibleDC( &dcClient ) ) return NULL; 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(), DRAG_COLOR_KEY ); ptMiddle.SetPoint( ptMouse.x - rcAll.left, ptMouse.y - rcAll.top ); CRgn pRgn; if ( bClipped ) { 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_szBlock ); CRect rcBuffer( 0, 0, m_szBlock.cx, m_szBlock.cy ); CFont* pOldFont = (CFont*)pBuffer->SelectObject( &CoolInterface.m_fntNormal ); for ( std::list< iterator >::iterator pTile = m_oSelTile.begin(); pTile != m_oSelTile.end(); ++pTile ) { GetItemRect( *pTile, &rcOne ); CRect rcDummy; if ( rcDummy.IntersectRect( &rcAll, &rcOne ) ) { pBuffer->FillSolidRect( &rcBuffer, DRAG_COLOR_KEY ); (**pTile)->Paint( pBuffer, rcBuffer, &dcMem, (*pTile) == m_pFocus ); dcDrag.BitBlt( rcOne.left - rcAll.left, rcOne.top - rcAll.top, m_szBlock.cx, m_szBlock.cy, pBuffer, 0, 0, SRCCOPY ); } } pBuffer->SelectObject( pOldFont ); dcDrag.SelectObject( pOldDrag ); dcDrag.DeleteDC(); return (HBITMAP) bmDrag.Detach(); }