Drag&Drop in a CTreeCtrl
dobrin@itls.com Monday, June 24, 1996 Hello Ladies & Gentlemen ! My application is written in VC++ 4.1 and runs on NT3.51. Drag & Drop in the CTreeCtrl shows the "dragged" image, but also a "copy" of that image at the root level of the tree, which moves together with the dragged item. Please give me an answer on this problem . Thank you in advance, Dan Dobrin dan.dobrin@itls.com Routines included : void CTreeCtrlEx::OnBegindrag(NMHDR* pNMHDR, LRESULT* pResult) { TV_ITEM tvI; UINT nImageId; HTREEITEM hItem; NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR; tvI = pNMTreeView->itemNew; // Get a handle to the drag object. m_hDragItem = tvI.hItem; item.mask = TVIF_HANDLE | TVIF_IMAGE; item.hItem= m_hDragItem; GetItem(&item); nImageId = item.iImage; BeginDrag((NM_TREEVIEW *)pNMTreeView); *pResult = 0; } void CTreeCtrlEx::OnMouseMove(UINT nFlags, CPoint point) { HTREEITEM hTarget; UINT flags; if (m_fDragging) { // Drag the item to the current mouse position. pImageList->DragMove(point); flags = TVHT_ONITEM | TVHT_ONITEMRIGHT; // if the cursor is on an item, highlight it as the drop target. if ((hTarget = HitTest(point, &flags)) != NULL) { pImageList->DragLeave(this); SelectDropTarget(hTarget); pImageList->DragEnter(this, point); } } CTreeCtrl::OnMouseMove(nFlags, point); } void CTreeCtrlEx::OnLButtonUp(UINT nFlags, CPoint point) { // If dragging, stop it. if (m_fDragging) { pImageList->DragLeave(this); pImageList->EndDrag(); // Process the item drop. DropItem(m_hDragItem); // Release the mouse. ReleaseCapture(); // Show the normal cursor. ShowCursor(TRUE); // Reset boolean. m_fDragging = FALSE; } CTreeCtrl::OnLButtonUp(nFlags, point); } /********************************************************************* ****** * * FUNCTION: BeginDrag(NM_TREEVIEW *) * * PURPOSE: This function proceeses the beginning of a drag operation. * ********************************************************************** *****/ void CTreeCtrlEx::BeginDrag(NM_TREEVIEW *lItem) { // Create an image to use for dragging. pImageList = CreateDragImage(lItem->itemOld.hItem); // show image pImageList->DragShowNolock(TRUE); //create drag cursor image pImageList->SetDragCursorImage(0, lItem->ptDrag); ShowCursor(FALSE); // Start dragging the image. pImageList->BeginDrag(0, lItem->ptDrag); pImageList->DragMove(lItem->ptDrag); pImageList->DragEnter(this, lItem->ptDrag); // Hide the cursor SetCapture(); m_fDragging = TRUE; } /********************************************************************* ****** * * FUNCTION: DropItem(HTREEITEM) * * PURPOSE: This function proceeses the drop consequences. * ********************************************************************** *****/ void CTreeCtrlEx::DropItem(HTREEITEM hDragItem) { HTREEITEM hParent, hTarget; // Get the handle to the drop target. hTarget = GetDropHilightItem(); // Get the parent of the drop target. hParent = GetParentItem(hTarget); TV_INSERTSTRUCT tvIns; TCHAR szBuffer[100]; tvIns.item.hItem = hDragItem; tvIns.item.cchTextMax = 99; tvIns.item.pszText = szBuffer; tvIns.item.mask = TVIF_CHILDREN | TVIF_HANDLE | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_TEXT | TVIF_PARAM; GetItem(&tvIns.item); tvIns.hInsertAfter = hTarget; tvIns.hParent = hParent; InsertItem(&tvIns); // Delete the "dragged" item. DeleteItem(hDragItem); // Reset the drop target to NULL. SelectDropTarget((HTREEITEM)NULL); }
Roland Pasternack -- rep@jupiter.Legato.COM Friday, June 28, 1996 At 01:13 PM 6/24/96 -0500, you wrote: >Hello Ladies & Gentlemen ! > >My application is written in VC++ 4.1 and runs on NT3.51. > >Drag & Drop in the CTreeCtrl shows the "dragged" image, but also a >"copy" of that image at the root level of the tree, which moves >together with the dragged item. > >Please give me an answer on this problem . > >Thank you in advance, > >Dan Dobrin >dan.dobrin@itls.com Dan, I tried doing drag and drop in a tree control a while ago and ran into several problems. When I started to research the problems I discovered that drag and drop in a tree control was not well documented, nor could I find any samples. I ended up calling Microsoft and speaking to a support person who wrote some sample code to do this. I do not have the time to review your code and try to figure out exactly what is causing your problem, but if you e-mail me I will forward the sample code to you. Roland rpasternack@legato.com
| Вернуться в корень Архива |