首 页 | 新 闻 | Symbian | Android| Windows Mobile | J2ME | 下载中心 | 游戏策划招聘与求职 | 购书指南 | 视频教程
您现在的位置: 开发视界 >> Symbian >> 语言基础 >> 正文
C++ Builder 实现控件的拖动-停靠操作
作者:unknown    文章来源:不详    更新时间:2006-5-6 20:26:04
 
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事件,在拖动结束时发生。

 
相关文章:
简单控件和复合控件的使用
Symbian绘图全过程
绘图知识(二)——为客户端窗口设置缓冲区
关于简单的对话框
symbian中的几个API
深入理解Symbian控件架构
OPL 速成教程(四)
OPL 速成教程(三)
 

站点地图 | 加入收藏 | 联系站长 | 广告服务 |
QQ:280529124  Tel:0592-8271361 辽ICP备05021703号