WEB开发网      婵犵數濞€濞佳囧磹婵犳艾鐤炬い鎰堕檮閸嬬喐銇勯弽銊с€掗梻鍕閺岋箑螣娓氼垱笑闂佽姘﹂褔婀佸┑鐘诧工妤犲憡绂嶉崜褏纾奸弶鍫涘妼缁楁岸鏌熷畡鐗堝殗闁诡喒鏅犲畷褰掝敃閵堝棙顔忔繝鐢靛仦閸ㄥ爼骞愰幘顔肩;闁规崘绉ぐ鎺撳亹闁绘垶锕╁Λ鍕⒑閹肩偛濡奸悗娑掓櫇缁顓兼径妯绘櫇闂佹寧绻傞弻濠囨晝閸屾稓鍘甸柣搴㈢⊕閿氶柣蹇ョ稻缁绘繃绻濋崘銊т紝闂佽鍨伴崯鏉戠暦閻旂⒈鏁傞柛鈾€鏅欑槐妯衡攽閻愬樊鍤熷┑顔藉劤铻為柛鏇ㄥ墯閸欏繘鏌嶉崫鍕櫣缂佲偓婢跺绠鹃柟瀛樼箘閿涘秵顨ラ悙顏勭伈闁诡喖缍婂畷鎯邦槻婵℃彃顭烽弻娑㈠Ω閵夈儺鍔夌紓浣稿€哥粔褰掑极閹剧粯鏅搁柨鐕傛嫹 ---闂傚倷鐒︾€笛兠洪埡鍛闁跨噦鎷�
开发学院软件开发VC 控件“树”中多选拖放功能的实现 阅读

控件“树”中多选拖放功能的实现

 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(),它可以作为您编写自己的回调函数的一个参考。

上一页  1 2 3 4 5 

Tags:控件 功能 实现

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接