Delphi中停靠技术的实现Word下载.docx
- 文档编号:15803586
- 上传时间:2022-11-16
- 格式:DOCX
- 页数:11
- 大小:20.49KB
Delphi中停靠技术的实现Word下载.docx
《Delphi中停靠技术的实现Word下载.docx》由会员分享,可在线阅读,更多相关《Delphi中停靠技术的实现Word下载.docx(11页珍藏版)》请在冰豆网上搜索。
就这么简单,只要设置一下属性,一个支持停靠的程序就完成了。
当然,上面说的只是最最基本的步骤,有了以上两步,我们就可以继续编写代码实现更复杂的功能。
一般的支持停靠的程序都可以在主窗口的上下左右停靠,也就是说在主窗口的边上放上能被停靠的控件比较好(只要是从TWinControl继承的都行),一般我们都选择TPanel,为了便于读者理解,我们可以假定主窗口的左边可以停靠,所以在主窗口上放一个Align属性为alLeft的Panel,取名为LeftDockPanel,宽度为0,DockSite属性为True,当然我们的LeftDockPanel应该是可以改变大小的,所以在它右边再放一个TSplitter,取名为LeftSplitter,Align属性为alLeft。
接下来就是停靠控件了,一般的程序停靠控件都是窗体,所以我们也建一个窗体,取名叫DockableForm,DragKind属性设成dkDock,DragMode属性设为dmAutomatic(自动停靠)。
现在我们可以运行这个程序了,什么?
效果不好?
停靠的窗体停靠停靠进去后就不见了!
哦,我差点忘了,当停靠窗体停靠时Delphi会产生一些事件,他们分别是
1.OnDockOver(Sender:
TObject;
Source:
TDragDockObject;
X,Y:
Integer;
State:
TDragState;
varAccept:
Boolean);
2.OnDockDrop(Sender:
Integer);
3.OnGetSiteInfo(Sender:
DockClient:
TControl;
varInfluenceRect:
TRect;
MousePos:
TPoint;
varCanDock:
4.OnStartDock(Sender:
varDragObject:
TDragDockObject);
5.OnEndDock(Sender,Target:
X,Y:
6.OnUnDock(Sender:
Client:
NewTarget:
TWinControl;
varAllow:
哇,这么多,别急,让我细细道来:
先让我们来看看第一个事件
OnDockOver是在停靠控件(DockableForm)掠过被停靠控件(LeftDockPanel)时触发的。
Source包含了停靠—拖动操作的信息,其中有一个重要的属性是Control,就是DockableForm,另一个重要的属性是DockRect,就是停靠的位置;
X,Y是鼠标的位置,State的状态有dsDragEnter,dsDragLeave,dsDragMove,分别表示拖动进入,拖动离开,拖动移动;
Accept是是否同意停靠的意思。
OnDockOver事件主要作用是控制停靠窗体的预览位置,下面我们来加入以下代码:
procedureTMainForm.LeftDockPanelDockOver(Sender:
var
ARect:
begin
Accept:
=Source.ControlisTDockableForm;
ifAcceptthen
begin
//修改预览停靠位置
ARect.TopLeft:
=LeftDockPanel.ClientToScreen(Point(0,0));
ARect.BottomRight:
=LeftDockPanel.ClientToScreen(
Point(Self.ClientWidthdiv3,LeftDockPanel.Height));
Source.DockRect:
=ARect;
end;
end;
现在再运行程序,当你把DockableForm拖动到主窗口左边时,已经出现了预览停靠位置,也就是虚线包含的范围。
怎么?
窗体又不见了?
那当然了,我们只是讲了OnDockOver,还没详细讲解OnDockDrop呢,它才是决定停靠窗体在哪里出现的罪魁祸首:
OnDockDrop(Sender:
参数和OnDockOver差不多,只是少了State:
TDragState和varAccept:
Boolean
它是在停靠窗体进入被停靠控件时发生的,作用是控制停靠窗体的最终位置。
下面添加如下代码:
procedureTMainForm.LeftDockPanelDockDrop(Sender:
Begin
LeftDockPanel.Width:
=ClientWidthdiv3;
LeftSplitter.Left:
=LeftDockPanel.Width+LeftSplitter.Width;
End;
现在再运行程序,哇塞,成功了。
出现了一个和Delphi的IDE完全一样的停靠窗体,上面是两条横线,用来把它拖出来,右上角有一个小X是用来关闭的。
不过好景不长,当我们把它关闭时,装载DockableForm的LeftDockPanel不能还原,还是霸占着主窗口的客户区,怎么办?
嘻嘻,忘了告诉你们了,其实Delphi早就为我们作好了一切。
请打开DockableForm的关闭事件,你会发现原来当你点击右上角那个小X关闭DockableForm时,它会触发DockableForm的OnClose事件,在OnClose事件中把LeftDockPanel的宽度设为0就行了。
procedureTDockableForm.FormClose(Sender:
varAction:
TCloseAction);
MainForm.LeftDockPanel.Width:
=0;
Action:
=caHide;
以上所讲的是如何在主窗口上停靠窗体,原代码都通过测试。
同理,我们可以在主窗口的右边,下边,上边都实现停靠功能。
对了,刚才我们只介绍了OnDockOver和OnDockDrop,忘了介绍别的事件,下面简单介绍一下:
这个事件是在窗体移动时触发的,所以经常触发,它里面的DockClient就是TDockableForm,
有一个引用参数叫CanDock,和OnDockOver中的Accept差不多,都是询问是否允许停靠。
在这里可以不写,CanDock默认就是True,也可以写上CanDock:
=DockClientisTDockableForm;
这三个事件都是在DockableForm上面有用,意思分别是停靠开始,停靠结尾,不停靠(也就是被拖出来时)。
OnStartDock和OnEndDock经常会被触发,
OnUnDock只在停靠窗体变成浮动时触发
讲了那么多,大家有没有被搞糊涂?
那好,我来做一下总结:
在Delphi中只要是从TWinControl继承的控件都支持被停靠(如上面的LeftDockPanel),也就是有DockSite这个属性;
所有从TControl继承的控件都支持停靠(如上面的DockableForm),也就是有DragKind这个属性.所以支持被停靠的控件都支持停靠,支持停靠的控件不一定支持被停靠,道理很简单,因为TWinControl继承于TControl。
OnDockOver事件是控制停靠窗体的预览位置;
OnDockDrap事件是控制停靠窗体的最终位置;
OnGetSiteInfo是询问是否可以停靠;
OnStartDock是停靠开始,OnEndDock是停靠结尾,OnUnDock是不停靠(也就是被拖出来时)。
想必Delphi用的熟的大虾都知道在Delphi的可停靠窗体间可以相互停靠,而且花样还很多,可以停靠成并排的,也可以停靠成PageControl样式的,两个可停靠窗体合并后的窗体又可以再和别的可停靠窗体合并,形成树状。
下面来介绍这方面的技术:
说道这里,我们不得不介绍一下CM_DOCKCLIENT消息和TCMDockClient结构,
CM_DOCKCLIENT消息和TCMDockClient结构是相互对应的,TCMDockClient的结构是:
TCMDockClient=packedrecord
Msg:
Cardinal;
DockSource:
TSmallPoint;
Result:
其中DockSource包含了停靠—拖动操作的信息,前面已经提到过;
MousePos是鼠标的位置。
CM_DOCKCLIENT事件在停靠和被停靠控件都可以捕获,因为它是TWinControl类发出的,
代码如下:
procedureTWinControl.DockDrop(Source:
if(Perform(CM_DOCKCLIENT,Integer(Source),Integer(SmallPoint(X,Y)))>
=0)
andAssigned(FOnDockDrop)then
FOnDockDrop(Self,Source,X
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Delphi 停靠 技术 实现
![提示](https://static.bdocx.com/images/bang_tan.gif)