Re: Drag and drop between two tree controls
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@gmail.com> wrote in message
news:1173870151.182025.132240@n76g2000hsh.googlegroups.com...
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?????