C++ Builder 实现控件的拖动停靠操作

http://www.fm0898.com/show.aspx?id=20855&cid=108

5.2 实现控件的拖动-停靠操作

TWinControl的派生类可作为停靠点,而TControl的派生类可作为停放到停靠点的子窗口。例如,要在窗体的窗口左边界提供一个停靠点,可将一个面板排列到窗体左边界并使面板成为一个停靠点。当可停靠的控件被拖动到面板中并释放时,它们成为面板的子控件。

· 使窗口控件成为一个停靠点。
· 使控件成为一个可停靠子控件。
· 控制子控件如何被停放。
· 控制子控件如何取消停靠。
· 控制子控件如何响应拖动-停靠操作。

5.2.1 使窗口控件成为一个停靠点
要使窗口控件成为一个停靠点:
1) 把DockSite属性设为true。
2) 要使停靠点对象只在包含已停放的客户时显示,将其AutoSize属性设为true。当AutoSize为true时,停靠点尺寸保持为0,直到它接受一个被停放的子控件。然后它会调整大小以适应子控件。

5.2.2 使控件成为一个可停靠子控件
要使控件成为一个可停靠子控件:
1) 把DragKind属性设为dkDock。当DragKind为dkDock时,可将控件移动到一个新的停靠点中,或取消控件的停靠以使它变成浮动窗口。 当DragKind为dkDrag(缺省)时,必须使用OnDragOver、OnEndDrag和OnDragDrop事件来实现拖动控件而开始的拖放 操作。
2) 把DragMode设为dmAutomatic。当DragMode为dmAutomatic时,拖动(根据DragKind的值判断是拖放操作或停靠操 作)会在用户开始使用鼠标拖动控件时自动初始化。当 DragMode为dmManual时,需调用BeginDrag方法来开始拖动-停靠(或拖放)操作。
3) 设置TWinControl的派生类的FloatingDockSiteClass属性,以指定它作为那些被取消停靠的浮动窗口的暂驻窗口。当控件没有在 停靠点被释放时,一个这类的窗口控件被动态创建,同时,成为该可停靠子控件的父类。若这个可停靠子控件是TWinControl的派生类,则不需单独为它 创建一个停靠点来暂驻控件,尽管可以为获得边界和标题栏而指定一个窗体。为了省略动态暂驻窗口,把控件的
FloatingDockSiteClass设为与控件的类一样,则它将变成一个没有父类的浮动窗口。

5.2.3 控制子控件如何被停放
当子控件在停靠点上方被释放时,停靠点会自动接受子控件。对于大多数控件来说,第一个被停放的子控件填满客户区,第二个被停放的子控件将客户区分隔为两个独立的区域等等。Page控件将子控件停放入新页中(若子控件为另一个Page控件则合并页)。

有三个事件允许停靠点进一步限制子控件如何停放:
点击放大

停 靠点的OnGetSiteInfo事件在用户拖动可停靠子控件到其上方时发生。它可让停靠点指出是否可接受DockClient参数指定的控件作为它的子 控件,若可接受,还必须考虑子控件停放的位置。当OnGetSiteInfo发生时,InfluenceRect初始化停靠点的屏幕坐标,且 CanDock初始化为true。通过改变InfluenceRect可创建具有更多限制的停靠区,而通过将CanDock设为false可拒绝子控件的 停放。


停 靠点的OnDockOver事件也在用户拖动可停靠子控件到其上方时发生。它与拖放操作的OnDragOver事件类似。通过设置其Accept参数来指 出子控件可被释放并停放。若该可停靠子控件由OnGetSiteInfo事件处理程序拒绝停放(也许因为控件类型的错误),OnDockOver事件不会 发生。


停 靠点的OnDockDrop在用户拖动可停靠子控件到其上方并释放时发生。它与拖放操作的OnDragDrop事件类似。可使用本事件来执行接受控件为子 控件所需的必要的调整。通过使用Source参数所指定的TDockObject对象的Control属性可访问子控件。

5.2.4 控制子控件如何取消停靠
当子控件的DragMode属性为dmAutomatic且被拖动时,停靠点可自动允许子控件取消停靠。停靠点可在OnUnDock事件处理程序中响应子控件被拖走或禁止取消停靠:
点击放大

Client 参数指出要取消停靠的子控件,Allow参数可让停靠点(Sender)拒绝取消停靠的操作。在实现OnUnDock事件处理程序时,知道停靠点内当前停 放的其他子控件(若存在)可能会有用处。这个信息存放在只读属性DockClients中,它是一个TControl的索引数组。已停放的客户数由只读属 性DockClientCount给出。

5.2.5 控制子控件如何响应拖动-停靠操作
可停靠子控件有两个发生拖动-停靠操作期间的事件:OnStartDock事件和拖放操作的OnStartDrag事件相似,允许可停靠子控件创建定制的拖放对象。OnEndDock事件类似于OnEndDrag事件,在拖动结束时发生。

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

http://www.4oa.com/Article/html/6/33/476/2005/17064.html

第5章应用控件 控件是一些用户可在运行时进行交互的可视化组件,本章将介绍控件的各种通用特点。 5.1 实现控件拖放操作 拖放是用户操纵对象的常用的方法。用户可拖动整个控件,或将某一个控件(如列表框或树状视图)中的项拖动到另一个控件中。
第5章 应用控件

控件是一些用户可在运行时进行交互的可视化组件,本章将介绍控件的各种通用特点。

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属性可定制拖动操作期间鼠标指针的外观。

原文地址:https://www.cnblogs.com/chulia20002001/p/2030243.html