ImageVerifierCode 换一换
格式:DOCX , 页数:11 ,大小:20.49KB ,
资源ID:2892544      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/2892544.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(Delphi中停靠技术的实现.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

Delphi中停靠技术的实现.docx

1、Delphi中停靠技术的实现Delphi中停靠技术的实现 发表时间:2004-8-10作者:未知获得此文档时候没有作者记录,深感抱歉,本文档全为转载 Delphi中停靠技术的实现随着软件技术的不断进步,软件界面也越来越美观,操作也越来越方便。综观市面上比较专业的各种软件,我们会发现大部分都提供窗体停靠的功能,特别象工具软件,基本上都或多或少有停靠功能。自然,Delphi也支持停靠,而且她和VCL紧密结合,对于广大的Delphi程序员来说更是一大福音。让我们省去枯燥的编码时间。把注意力集中在核心程序的构思上。先让我们来复习一下VCL的结构,在TWinControl类中有一个DockSite属性(

2、boolean),它的作用是是否允许别的控件停靠在它的上面,在TControl类中有一个DragKind属性,如果要这个控件能停靠在别的控件上,就把DragKind属性设成dkDock。就这么简单,只要设置一下属性,一个支持停靠的程序就完成了。当然,上面说的只是最最基本的步骤,有了以上两步,我们就可以继续编写代码实现更复杂的功能。一般的支持停靠的程序都可以在主窗口的上下左右停靠,也就是说在主窗口的边上放上能被停靠的控件比较好(只要是从TWinControl继承的都行),一般我们都选择TPanel,为了便于读者理解,我们可以假定主窗口的左边可以停靠,所以在主窗口上放一个Align属性为alLef

3、t的Panel,取名为LeftDockPanel,宽度为0,DockSite属性为True,当然我们的LeftDockPanel应该是可以改变大小的,所以在它右边再放一个TSplitter,取名为LeftSplitter,Align属性为alLeft。接下来就是停靠控件了,一般的程序停靠控件都是窗体,所以我们也建一个窗体,取名叫DockableForm,DragKind属性设成dkDock,DragMode属性设为dmAutomatic(自动停靠)。现在我们可以运行这个程序了,什么?效果不好?停靠的窗体停靠停靠进去后就不见了!哦,我差点忘了,当停靠窗体停靠时Delphi会产生一些事件,他们分别

4、是1OnDockOver(Sender: TObject; Source: TDragDockObject; X, Y: Integer; State: TDragState; var Accept: Boolean);2OnDockDrop(Sender: TObject; Source: TDragDockObject; X, Y: Integer);3OnGetSiteInfo(Sender: TObject; DockClient: TControl; var InfluenceRect: TRect; MousePos: TPoint; var CanDock: Boolean);4

5、OnStartDock(Sender: TObject; var DragObject: TDragDockObject);5OnEndDock(Sender, Target: TObject; X, Y: Integer);6OnUnDock(Sender: TObject; Client: TControl; NewTarget: TWinControl; var Allow: Boolean);哇,这么多,别急,让我细细道来:先让我们来看看第一个事件OnDockOver是在停靠控件(DockableForm)掠过被停靠控件(LeftDockPanel)时触发的。Source包含了停靠拖动

6、操作的信息,其中有一个重要的属性是Control,就是DockableForm,另一个重要的属性是DockRect,就是停靠的位置;X,Y是鼠标的位置,State的状态有dsDragEnter, dsDragLeave, dsDragMove,分别表示拖动进入,拖动离开,拖动移动;Accept是是否同意停靠的意思。OnDockOver事件主要作用是控制停靠窗体的预览位置,下面我们来加入以下代码:procedure TMainForm.LeftDockPanelDockOver(Sender: TObject; Source: TDragDockObject; X, Y: Integer; St

7、ate: TDragState; var Accept: Boolean);var ARect: TRect;begin Accept := Source.Control is TDockableForm; if Accept then begin/修改预览停靠位置ARect.TopLeft := LeftDockPanel.ClientToScreen(Point(0, 0); ARect.BottomRight := LeftDockPanel.ClientToScreen( Point(Self.ClientWidth div 3, LeftDockPanel.Height); Sour

8、ce.DockRect := ARect; end;end;现在再运行程序,当你把DockableForm拖动到主窗口左边时,已经出现了预览停靠位置,也就是虚线包含的范围。怎么?窗体又不见了?那当然了,我们只是讲了OnDockOver,还没详细讲解OnDockDrop呢,它才是决定停靠窗体在哪里出现的罪魁祸首:OnDockDrop(Sender: TObject; Source: TDragDockObject; X, Y: Integer);参数和OnDockOver差不多,只是少了State: TDragState和var Accept: Boolean它是在停靠窗体进入被停靠控件时发生的

9、,作用是控制停靠窗体的最终位置。下面添加如下代码:procedure TMainForm.LeftDockPanelDockDrop(Sender: TObject; Source: TDragDockObject; X, Y: Integer);Begin LeftDockPanel.Width := ClientWidth div 3; LeftSplitter.Left := LeftDockPanel.Width + LeftSplitter.Width;End;现在再运行程序,哇塞,成功了。出现了一个和Delphi的IDE完全一样的停靠窗体,上面是两条横线,用来把它拖出来,右上角有一

10、个小X是用来关闭的。不过好景不长,当我们把它关闭时,装载DockableForm的LeftDockPanel不能还原,还是霸占着主窗口的客户区,怎么办?嘻嘻,忘了告诉你们了,其实Delphi早就为我们作好了一切。请打开DockableForm的关闭事件,你会发现原来当你点击右上角那个小X关闭DockableForm时,它会触发DockableForm的OnClose事件,在OnClose事件中把LeftDockPanel的宽度设为0就行了。procedure TDockableForm.FormClose(Sender: TObject; var Action: TCloseAction);b

11、egin MainForm.LeftDockPanel.Width := 0; Action := caHide;end;以上所讲的是如何在主窗口上停靠窗体,原代码都通过测试。同理,我们可以在主窗口的右边,下边,上边都实现停靠功能。对了,刚才我们只介绍了OnDockOver和OnDockDrop,忘了介绍别的事件,下面简单介绍一下:3OnGetSiteInfo(Sender: TObject; DockClient: TControl; var InfluenceRect: TRect; MousePos: TPoint; var CanDock: Boolean);这个事件是在窗体移动时触发

12、的,所以经常触发,它里面的DockClient就是TDockableForm,有一个引用参数叫CanDock,和OnDockOver中的Accept差不多,都是询问是否允许停靠。在这里可以不写,CanDock默认就是True,也可以写上CanDock := DockClient is TDockableForm;4OnStartDock(Sender: TObject; var DragObject: TDragDockObject);5OnEndDock(Sender, Target: TObject; X, Y: Integer);6OnUnDock(Sender: TObject; Cl

13、ient: TControl; NewTarget: TWinControl; var Allow: Boolean);这三个事件都是在DockableForm上面有用,意思分别是停靠开始,停靠结尾,不停靠(也就是被拖出来时)。OnStartDock和OnEndDock经常会被触发,OnUnDock只在停靠窗体变成浮动时触发讲了那么多,大家有没有被搞糊涂?那好,我来做一下总结:在Delphi中只要是从TWinControl继承的控件都支持被停靠(如上面的LeftDockPanel),也就是有DockSite这个属性;所有从TControl继承的控件都支持停靠(如上面的DockableForm)

14、,也就是有DragKind这个属性.所以支持被停靠的控件都支持停靠,支持停靠的控件不一定支持被停靠,道理很简单,因为TWinControl继承于TControl。OnDockOver事件是控制停靠窗体的预览位置;OnDockDrap事件是控制停靠窗体的最终位置;OnGetSiteInfo是询问是否可以停靠;OnStartDock是停靠开始,OnEndDock是停靠结尾,OnUnDock是不停靠(也就是被拖出来时)。想必Delphi用的熟的大虾都知道在Delphi的可停靠窗体间可以相互停靠,而且花样还很多,可以停靠成并排的,也可以停靠成PageControl样式的,两个可停靠窗体合并后的窗体又可

15、以再和别的可停靠窗体合并,形成树状。下面来介绍这方面的技术:说道这里,我们不得不介绍一下CM_DOCKCLIENT消息和TCMDockClient结构,CM_DOCKCLIENT消息和TCMDockClient结构是相互对应的,TCMDockClient的结构是: TCMDockClient = packed record Msg: Cardinal; DockSource: TDragDockObject; MousePos: TSmallPoint; Result: Integer; end;其中DockSource包含了停靠拖动操作的信息,前面已经提到过;MousePos是鼠标的位置。CM_DOCKCLIENT事件在停靠和被停靠控件都可以捕获,因为它是TWinControl类发出的,代码如下:procedure TWinControl.DockDrop(Source: TDragDockObject; X, Y: Integer);begin if (Perform(CM_DOCKCLIENT, Integer(Source), Integer(SmallPoint(X, Y) = 0) and Assigned(FOnDockDrop) then FOnDockDrop(Self, Source, X

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1