怎么把一个目录拖动到treectrl中并显示节点的变化(蓝色)

如何把一个目录拖动到treectrl中并显示节点的变化(蓝色)?
我的要求:

 拖动资源管理器的目录到我的程序的treectrl中, 可以显示treectrl中当前的指向的节点的变化.

当不拖动时, 不应该再显示节点的变化.

可现在的情况是当不拖动时,只是移动mouse, 还是显示节点的变化, 这是个大错误..


我建立了一个对话框程序, 上面只放了一个treectrl控件. 其属性acceptfiles 为true.

has_button, line at root, has_line, always show selection, edit lables属性都必须为tree.
C/C++ code

void CMyTreeCtrl::OnMouseMove(UINT nFlags, CPoint point)
{
    // TODO: 在此添加消息处理程序代码和/或调用默认值

//        if ((nFlags & MK_LBUTTON) == MK_LBUTTON)
    {
        CPoint pt (point);
        ClientToScreen (&pt);

        // get the CWnd pointer of the window that is under the mouse cursor
        CWnd* pDropWnd = WindowFromPoint (pt);
        ASSERT (pDropWnd);
        // if we drag outside current window
        if (pDropWnd != m_pDropWnd)
        {
            // turn off hilight for drop target in tree control
            if (m_hDropItem)
            {
                ((CTreeCtrl*)m_pDropWnd)->SelectDropTarget (NULL);
                m_hDropItem = NULL;
            }
        }

        // save current window pointer
        m_pDropWnd = pDropWnd;

        // convert from screen coordinates to drop target client coordinates
        pDropWnd->ScreenToClient (&pt);

        // if window is CTreeCtrl
        if (pDropWnd->IsKindOf (RUNTIME_CLASS (CMyTreeCtrl)))
        {            
            UINT uFlags;
            // get the item that is below cursor
            m_hDropItem = ((CTreeCtrl*)pDropWnd)->HitTest (pt, &uFlags);
            // highlight it
            if (m_hDropItem != NULL)
            ((CTreeCtrl*)pDropWnd)->SelectDropTarget (m_hDropItem);
        }
    }
    

    CTreeCtrl::OnMouseMove(nFlags, point);
}
注意一下, 上面的 if ((nFlags & MK_LBUTTON) == MK_LBUTTON)被注释掉了,因为它永远不为true.

而且也不响应WM_LBUTTONUP 消息.

有人说应该加setcapture(), 上面的语句就可以为true了, 我加在了好几个地方, 都不行.

我不需要窗口内控件与控件之间的拖动 (他可以将setcapture()放在beginDrag()中).
而我的需求是拖动资源管理器的目录到我的程序的treectrl中.我的treectrl是拖动目标而不是源(BeginDrop()无效)

怎么办?

或者其他思路也可以, 谁推荐一下源码.




------解决方案--------------------
你应该有个标记来表示当前的动作,是否是拖动还是只是简单的移动鼠标,应该也要处理WM_LBUTTONDOWN/WM_LBUTTONUP消息,DOWN的时候设置标记,UP的时候重置标记值。
------解决方案--------------------
C/C++ code
case WM_MOUSEMOVE:
            pt.x=LOWORD(lParam);
            pt.y=HIWORD(lParam);
            if((g_fDragging1) || (g_fDragging2))
            {
                ImageList_DragMove(pt.x,pt.y+Offset);
                ImageList_DragEnter(hWnd,pt.x,pt.y+Offset);
            }
            // If the cursor is on an item, highlight it as the drop target.
            GetClientRect(hTree1,&rc);
            MapWindowPoints(hTree1,hWnd,(LPPOINT)&rc,2);
            if(rc.PtInRect(pt))
            {
                TreeView_SelectDropTarget(hTree2,0);
                MapWindowPoints(hWnd,hTree1,&pt,1);
                SetDropTarget(hTree1,&pt);
            }
            else
            {
                TreeView_SelectDropTarget(hTree1,0);
                MapWindowPoints(hWnd,hTree2,&pt,1);
                SetDropTarget(hTree2,&pt);
            }
            break;
                
        case WM_LBUTTONUP:// If dragging, stop it.
            pt.x=LOWORD(lParam);
            pt.y=HIWORD(lParam);
            if((g_fDragging1) || (g_fDragging2))
            {
                ImageList_EndDrag();
                //
                DropItem(&pt);
                // Release the mouse capture.
                ReleaseCapture();
            }
            break;

------解决方案--------------------
我以前做OLE拖拽,感觉只要处理一个事件就可以了啊。。

我去翻下我老的代码
------解决方案--------------------