控件“树”中多选拖放功能的实现
2007-03-30 21:32:29 来源:WEB开发网核心提示: 在执行拖动操作的过程中,相应的释放目标项为突出显示,控件“树”中多选拖放功能的实现(5),如果当前鼠标位置所在的项为释放的目标位置项,则通过调用CTreeCtrl::SelectDropTarget()函数就可以使该项突出显示,您可以编写自己的回调函数来处理您所希望的加入到控件"
在执行拖动操作的过程中,相应的释放目标项为突出显示。如果当前鼠标位置所在的项为释放的目标位置项,则通过调用CTreeCtrl::SelectDropTarget()函数就可以使该项突出显示,否则,最近的父文件夹突出显示,如果父文件夹并不是释放的目标文件夹,那么任何项都不突出显示。
图2:拖动文件夹Cats中的"The Shedding Cycle"项到文件夹Snakes中:被拖动项含有一个点线画成的边框,释放的目标文件夹则反相显示。
边拖边滚
当拖动操作位于"树"控件的有效边界时,如果能够实现"树"控件窗口的自动上滚或下滚以显示其余的树项,那将是件很漂亮的工作。使用OnTimer()消息处理函数就可以完成这项工作。函数OnBeginDrag()中调用了SetTimer()函数,该函数中设置了定时器事件(timer event)EVENT_DRAG_SCROLL,该定时器事件只有在调用OnLButtonUp消息处理函数时才被释放。
OnTimer()消息处理函数可以实现当鼠标移到控件"树"窗口边界时,控件"树"窗口的上滚或下滚操作。在MSDN的程序示例TREESCR中,应用了此函数,它可以调整窗口相对与鼠标位置的滚动速度。
拖动结束(When the drag is over)当释放鼠标左键时,拖动操作结束。下面的OnLButtonUp()消息处理函数可以完成拖动结束时的各种事后处理工作:
void CBitmapTree::OnLButtonUp(UINT nFlags,
CPoint point)
{
if (m_dragList)
{
HTREEITEM target;
KillTimer(EVENT_DRAG_SCROLL);
ReleaseCapture();
m_dragList->EndDrag();
ShowCursor(TRUE);
m_dragList= NULL;
if ((target= GetDropHilightItem()) != NULL)
{
DoForAllSelected(m_dragFunction, NULL,
(LPARAM) target);
SelectDropTarget(NULL);
SelectItem(target);
}
ClearMultiSelect();
}
CTreeCtrl::OnLButtonUp(nFlags, point);
}
首先进行一些简单的拖放事件或函数的清理工作,然后判断是否有突出显示的释放目标项。如果有突出显示的释放目标项,则要利用回调函数。正如前面提到的那样,您可以编写自己的回调函数来处理您所希望的加入到控件"树"中的各种复杂功能。笔者为您提供的只是一个比较简单的回调函数MoveTreeItemCB(),它可以作为您编写自己的回调函数的一个参考。
更多精彩
赞助商链接