16,472
社区成员
发帖
与我相关
我的任务
分享
给你一个创建多个拖拽图标的例子
CImageList* CArrangeDlg::CreateDragImageEx(CListCtrl *pList, LPPOINT lpPoint)
{
if (pList->GetSelectedCount() <= 0)
return NULL; // no row selected
CRect rectSingle;
CRect rectComplete(0,0,0,0);
// Determine List Control Client width size
pList->GetClientRect(rectSingle);
int nWidth = rectSingle.Width();
// Start and Stop index in view area
int nIndex = pList->GetTopIndex() - 1;
int nBottomIndex = pList->GetTopIndex() + pList->GetCountPerPage() - 1;
if (nBottomIndex > (pList->GetItemCount() - 1))
nBottomIndex = pList->GetItemCount() - 1;
// Determine the size of the drag image (limite for rows visibled and Client width)
while ((nIndex = pList->GetNextItem(nIndex, LVNI_SELECTED)) != -1)
{
if (nIndex > nBottomIndex)
break;
pList->GetItemRect(nIndex, rectSingle, LVIR_BOUNDS);
if (rectSingle.left < 0)
rectSingle.left = 0;
if (rectSingle.right > nWidth)
rectSingle.right = nWidth;
rectComplete.UnionRect(rectComplete, rectSingle);
}
CClientDC dcClient(this);
CDC dcMem;
CBitmap Bitmap;
if (!dcMem.CreateCompatibleDC(&dcClient))
return NULL;
if (!Bitmap.CreateCompatibleBitmap(&dcClient, rectComplete.Width(), rectComplete.Height()))
return NULL;
CBitmap *pOldMemDCBitmap = dcMem.SelectObject(&Bitmap);
// Use green as mask color
dcMem.FillSolidRect(0, 0, rectComplete.Width(), rectComplete.Height(), RGB(0,255,0));
// Paint each DragImage in the DC
nIndex = pList->GetTopIndex() - 1;
while ((nIndex = pList->GetNextItem(nIndex, LVNI_SELECTED)) != -1)
{
if (nIndex > nBottomIndex)
break;
CPoint pt;
CImageList* pSingleImageList = pList->CreateDragImage(nIndex, &pt);
if (pSingleImageList)
{
pList->GetItemRect(nIndex, rectSingle, LVIR_BOUNDS);
pSingleImageList->Draw( &dcMem,
0,
CPoint(rectSingle.left - rectComplete.left,
rectSingle.top - rectComplete.top),
ILD_NORMAL);
pSingleImageList->DeleteImageList();
delete pSingleImageList;
}
}
dcMem.SelectObject(pOldMemDCBitmap);
CImageList* pCompleteImageList = new CImageList;
pCompleteImageList->Create(rectComplete.Width(), rectComplete.Height(), ILC_COLORDDB | ILC_MASK, 0, 1);
pCompleteImageList->Add(&Bitmap, RGB(0, 255, 0)); // Green is used as mask color
Bitmap.DeleteObject();
if (lpPoint)
{
lpPoint->x = rectComplete.left;
lpPoint->y = rectComplete.top;
}
return pCompleteImageList;
}