VC控件“树”中多选拖放功能的实现
2007-10-05 20:22:44 来源:WEB开发网拖动控件"树"中的项(Dragging a tree item)
在执行拖动操作的过程中,拖动图象根据操作的不同,显示上也有些变化。下面的处理程序OnMouseMove()就能够完成这些显示上的变化:
void CBitmapTree::OnMouseMove(UINT nFlags,
CPoint point)
{
if (m_dragList)
{
BOOL target_set = FALSE;
BOOL has_drag_images
= (m_ilDrag.m_hImageList != NULL);
HTREEITEM target;
CPoint screen= point;
MapWindowPoints(NULL, &screen, 1);
// 鼠标所在的位置是哪一项?
if ((target= GetItemUnderMouse()) != NULL)
{
int img, simg;
if (has_drag_images)
{
if (m_multiSelected)
m_dragList->SetDragCursorImage(m_multiDrag, CPoint(0,0));
else
m_dragList->SetDragCursorImage(m_docDrag, CPoint(0,0));
}
while (target)
{
GetItemImage(target, img, simg);
if (IsDropTarget(target, img))
{
m_dragList->DragLeave(NULL);
SelectDropTarget(target);
m_dragList->DragEnter(NULL, screen);
target_set= TRUE;
break;
}
target= GetParentItem(target);
}
}
else
{
// 超出有效区域
if (has_drag_images)
m_dragList->SetDragCursorImage(m_xDrag, CPoint(0,0));
}
if (!(target_set))
{
m_dragList->DragLeave(NULL);
SelectDropTarget(NULL);
m_dragList->DragEnter(NULL, screen);
}
}
CTreeCtrl::OnMouseMove(nFlags, point);
}
首先,如果在拖放操作的有效区域之外(如控件"树"窗口外或控件"树"窗口内的空白区)释放了鼠标左键,那么显示的拖动图象将表明"无任何操作"。当鼠标移动到拖放操作的有效区域内,拖动图象要恢复为正常状态。这些拖动图象的改变是通过把相应的图象传递给函数CImageList::SetDragCursorImage()来完成的,下面的图2表明了拖动图象的这种变化。如果调用函数SetDrag()时没有图象传递给该函数,则has_drag_images值为假,拖动图象就不会有任何改变。
更多精彩
赞助商链接