Re: Drag and drop between two tree controls

Tech-Archive recommends: Fix windows errors by optimizing your registry



You need to move the tree or expand the node on your own using a timer. You need to detect when the cursor is outside of the bounds of the tree (below or above) and scroll the tree appropriately. Here is some code (not the complete thing, but it may give you some ideas) that I used for a similar function. It just looks to see if the cursor was above or below the tree control then scrolled accordingly. If the cursor is hovering over a node then it expands it:

Here are a bunch of articles on using tree controls:

http://www.codeguru.com/cpp/controls/treeview/

void CTreeSide::MoveDropTarget(CPoint pt, CRect lRect)
{
CTreeCtrl &pTree = GetTreeCtrl();
// See if we need to scroll. If we are down towards the bottom, but have not
// scrolled to the last item, we need to scroll.
if(pt.y > lRect.BottomRight().y - 10) {
if(pt.x > lRect.TopLeft().x && pt.x < lRect.BottomRight().x) {
if(m_nScrollTimer <= 0) {
pTree.SendMessage(WM_VSCROLL, SB_LINEDOWN);
int nCount = pTree.GetVisibleCount();
HTREEITEM hitem = pTree.GetFirstVisibleItem();
for (int i=0; i<nCount-1; ++i)
hitem = pTree.GetNextVisibleItem(hitem);
if(hitem) {
m_hDragTarget = hitem;
m_nExpandTimer = EXPAND_TICKS;
// highlight it
pTree.SelectDropTarget (m_hDragTarget);
}
m_nScrollTimer = SCROLL_TICKS;
}
}
}

// See if we need to scroll. If we are close to the top but the first
// item is not showing, we need to scroll.
else if(pt.y < lRect.TopLeft().y + 10) {
if(pt.x > lRect.TopLeft().x && pt.x < lRect.BottomRight().x) {
if(m_nScrollTimer <= 0) {
pTree.SendMessage(WM_VSCROLL, SB_LINEUP);
HTREEITEM hitem = pTree.GetFirstVisibleItem();
if(hitem) {
m_hDragTarget = hitem;
m_nExpandTimer = EXPAND_TICKS;
// highlight it
pTree.SelectDropTarget (m_hDragTarget);
}
m_nScrollTimer = SCROLL_TICKS;
}
}
}
else { // We are still in our own window
// if window is our CTreeCtrl
UINT uFlags;
// get the item that is below cursor
m_hDragTarget = pTree.HitTest(pt, &uFlags);
if(m_hDragTarget != NULL) {
pTree.SelectDropTarget (m_hDragTarget); // highlight it
if(m_hOldDragTarget == NULL)
m_hOldDragTarget = pTree.GetDropHilightItem();
// If we are on a different item then we don't want to expand
if(m_hDragTarget != m_hOldDragTarget) {
m_nExpandTimer = EXPAND_TICKS;
m_hOldDragTarget = m_hDragTarget;
}

// Otherwise if the timer has elapsed expand the node
else if(m_nExpandTimer <= 0) {
if(pTree.ItemHasChildren(m_hDragTarget)) {
pTree.Expand(m_hDragTarget, TVE_EXPAND);
CString string = GetDocument()->GetPathFromNode(m_hDragTarget);
GetDocument()->SetExpanded(string,TRUE);
WalkTree(string); // Display children that are expanded
pTree.UpdateWindow();
}
}
}
}
}

void CTreeSide::OnTimer(UINT nIDEvent)
{
if(m_nScrollTimer > 0)
--m_nScrollTimer;
if(m_nExpandTimer > 0)
--m_nExpandTimer;
// If timer elapsed, pump a mouse move message
if(m_nScrollTimer == 0 || m_nExpandTimer == 0) {
POINT lppt; // address of structure for cursor position
GetCursorPos(&lppt);
SetCursorPos(lppt.x, lppt.y);
}
CMyFormView::OnTimer(nIDEvent);
}

<n.harpreet@xxxxxxxxx> wrote in message news:1173870151.182025.132240@xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
i have implemented drag and drop from one tree control to another but
i am unable to provide the scroll functionality with drag and drop
Any suggestions?????


.


Quantcast