怎么把一个目录拖动到treectrl中并显示节点的变化(蓝色)
如何把一个目录拖动到treectrl中并显示节点的变化(蓝色)?
我的要求:
拖动资源管理器的目录到我的程序的treectrl中, 可以显示treectrl中当前的指向的节点的变化.
当不拖动时, 不应该再显示节点的变化.
可现在的情况是当不拖动时,只是移动mouse, 还是显示节点的变化, 这是个大错误..
我建立了一个对话框程序, 上面只放了一个treectrl控件. 其属性acceptfiles 为true.
has_button, line at root, has_line, always show selection, edit lables属性都必须为tree.
而且也不响应WM_LBUTTONUP 消息.
有人说应该加setcapture(), 上面的语句就可以为true了, 我加在了好几个地方, 都不行.
我不需要窗口内控件与控件之间的拖动 (他可以将setcapture()放在beginDrag()中).
而我的需求是拖动资源管理器的目录到我的程序的treectrl中.我的treectrl是拖动目标而不是源(BeginDrop()无效)
怎么办?
或者其他思路也可以, 谁推荐一下源码.
------解决方案--------------------
你应该有个标记来表示当前的动作,是否是拖动还是只是简单的移动鼠标,应该也要处理WM_LBUTTONDOWN/WM_LBUTTONUP消息,DOWN的时候设置标记,UP的时候重置标记值。
------解决方案--------------------
我的要求:
拖动资源管理器的目录到我的程序的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); }
而且也不响应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拖拽,感觉只要处理一个事件就可以了啊。。
我去翻下我老的代码
------解决方案--------------------