CImageList *CTreeCtrlEx::CreateDragImageEx(HTREEITEM hItem) { CRect rect; GetItemRect(hItem, rect, true ); rect.left-=16+3; // // Create bitmap in memory DC // CClientDC cDc(this); CDC cMemDC; CBitmap cBitmap; if(!cMemDC.CreateCompatibleDC(&cDc)) return NULL; if(!cBitmap.CreateCompatibleBitmap(&cDc, rect.Width(),rect.Height())) return NULL; CBitmap* pOldMemDCBitmap=cMemDC.SelectObject( &cBitmap ); cMemDC.BitBlt( 0, 0, rect.Width(), rect.Height(), &cDc, rect.left, rect.top, SRCCOPY); cMemDC.SelectObject( pOldMemDCBitmap ); // // Create the imagelist with the merged drag images // CImageList* pCompleteImageList = new CImageList; pCompleteImageList->Create( rect.Width(), rect.Height(), ILC_COLOR24 | ILC_MASK,0,1); pCompleteImageList->Add(&cBitmap,GetSysColor(COLOR_WINDOW)); cBitmap.DeleteObject(); return pCompleteImageList; }
CImageList* CPlayerListCtrl::CreateDragImageEx(LPPOINT lpPoint) { if (GetSelectedCount() <= 0) { return nullptr; } CRect cSingleRect, cCompleteRect(0, 0, 0, 0); GetClientRect(cSingleRect); int nWidth = cSingleRect.Width(); // Start and Stop index in view area int nIndex = GetTopIndex() - 1; int nBottomIndex = GetBottomIndex(); // Determine the size of the drag image (limited for // rows visible and Client width) while ((nIndex = GetNextItem(nIndex, LVNI_SELECTED)) != -1 && nIndex <= nBottomIndex) { GetItemRect(nIndex, cSingleRect, LVIR_BOUNDS); /* CRect r; GetItemRect(nIndex, r, LVIR_LABEL); cSingleRect.left = r.left; */ if (cSingleRect.left < 0) { cSingleRect.left = 0; } if (cSingleRect.right > nWidth) { cSingleRect.right = nWidth; } cCompleteRect |= cSingleRect; } // // Create bitmap in memory DC // CClientDC cDc(this); CDC cMemDC; CBitmap cBitmap; if (!cMemDC.CreateCompatibleDC(&cDc)) { return nullptr; } if (!cBitmap.CreateCompatibleBitmap(&cDc, cCompleteRect.Width(), cCompleteRect.Height())) { return nullptr; } CBitmap* pOldMemDCBitmap = cMemDC.SelectObject(&cBitmap); // Here green is used as mask color cMemDC.FillSolidRect(0, 0, cCompleteRect.Width(), cCompleteRect.Height(), RGB(0, 255, 0)); // Paint each DragImage in the DC nIndex = GetTopIndex() - 1; while ((nIndex = GetNextItem(nIndex, LVNI_SELECTED)) != -1 && nIndex <= nBottomIndex) { CPoint pt; CImageList* pSingleImageList = CreateDragImage(nIndex, &pt); if (pSingleImageList) { GetItemRect(nIndex, cSingleRect, LVIR_BOUNDS); pSingleImageList->Draw(&cMemDC, 0, CPoint(cSingleRect.left - cCompleteRect.left, cSingleRect.top - cCompleteRect.top), ILD_MASK); pSingleImageList->DeleteImageList(); delete pSingleImageList; } } cMemDC.SelectObject(pOldMemDCBitmap); // // Create the image list with the merged drag images // CImageList* pCompleteImageList = DEBUG_NEW CImageList; pCompleteImageList->Create(cCompleteRect.Width(), cCompleteRect.Height(), ILC_COLOR | ILC_MASK, 0, 1); // Here green is used as mask color pCompleteImageList->Add(&cBitmap, RGB(0, 255, 0)); // // as an optional service: // Find the offset of the current mouse cursor to the image list // this we can use in BeginDrag() // if (lpPoint) { lpPoint->x = cCompleteRect.left; lpPoint->y = cCompleteRect.top; } return pCompleteImageList; }