C++ Builder 实现控件拖放操作

来源:互联网 发布:淘宝客服快捷短语大全 编辑:程序博客网 时间:2024/05/22 00:38

5.1 实现控件拖放操作
拖放是用户操纵对象的常用的方法。用户可拖动整个控件,或将某一个控件(如列表框或树状视图)中的项拖动到另一个控件中。
· 开始拖动操作。
· 接受被拖动的项。
· 放下项。
· 终止拖动操作。
· 通过拖动对象定制拖放操作。
· 改变拖动鼠标指针。

5.1.1开始拖动操作
每个控件都有DragMode属性用以确定如何初始化。若DragMode值为dmAutomatic,那么当用户将光标置于控件上并按下鼠标键时拖动操作自动开始。因为dmAutomatic可能会影响通常的鼠标活动,所以可把DragMode设为dmManual(缺省值),通过处理鼠标按下事件开始拖动操作。

为手动开始控件拖动操作,可调用该控件BeginDrag方法。BeginDrag需要一个布尔型参数Immediate。若其为true,拖动操作立即开始;若其为false,则拖动操作在用户将鼠标拖动一段短距离之前不会开始。调用BeginDrag(false)允许控件接受鼠标单击而不开始拖动操作。

可设置其他状态时开始控件拖动操作,如在调用BeginDrag方法之前通过检查其参数确定用户按下的是哪一个鼠标键。例如,下列代码通过将拖动操作初始化为只当鼠标左键被按下时才开始在处理文件列表框的鼠标按下事件。


5.1.2接受拖动项
当用户拖动某项经过一个控件上方时,该控件收到OnDragOver事件,这时必须指示出,若用户将拖动项放在此处,控件是否能接受拖动项。拖动光标的更改指示出控件是否能接受该拖动项。为接受经过控件上方的拖动项,应为控件的OnDragOver事件编写事件处理程序。
drag-over事件有一参数Accept,若需接受拖动项,可在事件处理程序中将其设为true。若Accept为true,应用程序将向控件发送一个drag-drop事件。drag-over事件还有其他的参数,包括拖动项的源及鼠标光标的当前位置,这些参数也可供事件处理程序确定是否接受放下操作。下例中,一个目录树视图只当拖动项来自文件列表框时才接受它们。


5.1.3放下项
若一个控件指示它能接受拖动项,它也应处理要被放下的项。为处理被放下的项,可为接受放下操作的控件的OnDragDrop事件编写事件处理程序。与drag-over事件相似,drag-drop事件指示拖动项的源及在接受控件上方的鼠标光标的坐标。后者允许监视项被拖动的路径;例如,可使用这个信息来改变有其他控件经过的组件的颜色。

下例中,一目录树视图接受来自文件列表框的拖动项,对应于移动文件到某个目录中并放下文件。


5.1.4 终止拖动操作
当拖动项被成功地放下或在不能接受它的控件上方被释放时,拖动操作结束。此时end-drag事件被发给拖动项的源控件。为使源控件响应拖动结束,应为控件的OnEndDrag事件编写事件处理程序。
OnEndDrag事件中最重要的参数是Target,它指出哪一个控件(若存在)接受了放下操作。若
Target为null,则意味着没有控件接受拖动项。OnEndDrag事件还包含接受控件的坐标。在下例中,文件列表框通过刷新其文件列表处理end-drag事件。
点击放大
5.1.5通过拖动对象定制拖放操作

可用TDragObject的派生类来定制对象的拖放操作。标准的drag-over和drag-drop事件指出拖动项的源及接受控件上方鼠标光标的坐标。要得到附加的状态信息,可从TDragObject派生一个定制的拖动对象并覆盖其虚拟方法。可在OnStartDrag事件中创建这个定制对象。
通常,drag-over和drag-drop事件中的源参数是指拖动操作开始的控件。若不同类型的控件需开始相同的数据的拖动操作,则源需要支持各类控件。当使用TDragObject的派生对象时,源即是拖动对象本身;若每个控件都在其OnStartDrag事件中创建相同类型的拖动对象,则目标只需处理一种类型的对象。
drag-over和drag-drop事件能通过调用IsDragObject函数得知源是拖动对象还是控件。拖动对象可使你在应用程序主EXE文件实现的窗体和DLL实现的窗体之间拖动项,或在不同的DLL实现的窗体之间拖动项。

5.1.6 改变拖动鼠标指针

通过设置源组件的DragCursor属性可定制拖动操作期间鼠标指针的外观。

原创粉丝点击