![]() |
Desktop Development »
Tree Controls »
Custom Tree Controls
Intermediate
License: The Code Project Open License (CPOL)
MultiSelect DragImage in CTreeCtrlBy Sudheesh.P.SThis article describes how to create a multiselect drag image in CTreeCtrl. |
VC6WinXP, MFC, Dev
|
|
Advanced Search Add to IE Search |
|
|
|
||||||||||||||||
This article describes how to create a multi select drag image in CTreeCtrl. I have created a custom tree control CDragDropTreeCtrl (derived from CTreeCtrl) for adding drag and drop support. CreateDragImageEx() is the core function, it creates the drag image list.
This class implements multiple selection with mouse, with the Ctrl or Shift key down. The DragDetect() API is used to detect the start of drag. Once the dragging is detected, the OnDrag() function is invoked. The OnDrag() function invokes CreateImageEx() to create the drag image list. The rest is the same as single selection drag. BeginDrag() and DragEnter() functions are used to prepare the image list for dragging. In the mouse move event, the drag image is moved.
This is the core function, which creates the drag image list. Steps in creating drag image list are:
ImageList_GetIconSize()
// 1.Get the image list associated with the tree control CImageList *pImageList = GetImageList(TVSIL_NORMAL); // 2.Get the icon size with the help of the API ImageList_GetIconSize() int cx,cy; ImageList_GetIconSize(*pImageList, &cx, &cy); // 3.Calculate the bounding rect of the drag image // a) Calculate the maximum width for ( nIdx = 0; nIdx < nNumSelected; nIdx++) { // Get the item's height and width one by one hItem = m_vSelItem[nIdx]; strItemText = GetItemText(hItem); rectFirstItem.SetRectEmpty(); pDragImageCalcDC->DrawText(strItemText, rectFirstItem, DT_CALCRECT); if(nMaxWidth < ( rectFirstItem.Width()+cx)) nMaxWidth = rectFirstItem.Width()+cx; }
// b) Calculate the height of single item and multiply it // with list size to get the total height hItem = m_vSelItem[0]; strItemText = GetItemText(hItem); rectFirstItem.SetRectEmpty(); pDragImageCalcDC->DrawText(strItemText, rectFirstItem, DT_CALCRECT); rectTextArea.SetRect(1, 1, nMaxWidth, rectFirstItem.Height()); rectBounding.SetRect(0,0, nMaxWidth+2, (rectFirstItem.Height()+2)*nNumSelected); // 4.Create a memory device context CDC MemoryDC; // 5.Prepare the memory DC if(!MemoryDC.CreateCompatibleDC(&DraggedNodeDC)) return NULL; // 6.Create and prepare bitmap object CBitmap DraggedNodeBmp; if(!DraggedNodeBmp.CreateCompatibleBitmap(&DraggedNodeDC, rectBounding.Width(), rectBounding.Height())) return NULL; // 7.Select Bitmap into the memory DC pBitmapOldMemDCBitmap = MemoryDC.SelectObject( &DraggedNodeBmp ); // 8.For each element in the list extract the icon // and associated text and draw them to the memory DC
for( nIdx = 0; nIdx < nNumSelected; nIdx++) { hItem = m_vSelItem[nIdx]; int nImg = 0,nSelImg=0; GetItemImage(hItem,nImg,nSelImg); HICON hIcon = pImageList->ExtractIcon(nImg); //cdcMemory.DrawIcon(rectTextArea.left,rectTextArea.top,hIcon); MemoryDC.MoveTo(rectTextArea.left,rectTextArea.top); if( nIdx != nNumSelected-1 ) { MemoryDC.LineTo(rectTextArea.left,rectTextArea.top+18); } else { MemoryDC.LineTo(rectTextArea.left,rectTextArea.top+8); } MemoryDC.MoveTo(rectTextArea.left,rectTextArea.top+8); MemoryDC.LineTo(rectTextArea.left+5,rectTextArea.top+8);
int nLeft = rectTextArea.left; rectTextArea.left += 3; ::DrawIconEx(MemoryDC.m_hDC,rectTextArea.left,rectTextArea.top,hIcon, 16,16,0,NULL,DI_NORMAL); rectTextArea.left += cx; MemoryDC.Rectangle(rectTextArea); MemoryDC.DrawText(GetItemText(hItem), rectTextArea, DT_LEFT| DT_SINGLELINE|DT_NOPREFIX); rectTextArea.left = nLeft; rectTextArea.OffsetRect(0, rectFirstItem.Height()+2); DestroyIcon(hIcon); } // 9.Create a new image list pImageListDraggedNode = new CImageList; pImageListDraggedNode->Create(rectBounding.Width(), rectBounding.Height(), ILC_COLOR | ILC_MASK, 0, 1); // 10.Add the bitmap to the image list pImageListDraggedNode->Add(&DraggedNodeBmp, RGB(255, 255,255));
This CDragDropTreeCtrl implements multiple selection with mouse only. The keyboard support will be updated later. With this method for creating drag image list, we can create drag image for list controls also.
| You must Sign In to use this message board. | |||||||||||||||
|
|||||||||||||||
|
|||||||||||||||
|
|||||||||||||||
|
|||||||||||||||
General
News
Question
Answer
Joke
Rant
Admin
Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+PgUp/PgDown to switch pages.
|
PermaLink |
Privacy |
Terms of Use
Last Updated: 21 Dec 2004 Editor: Rinish Biju |
Copyright 2004 by Sudheesh.P.S Everything else Copyright © CodeProject, 1999-2010 Web20 | Advertise on the Code Project |