Delphi7 窗口停靠效果

 

实现目的:

       实现MainForm中对DockForm的停靠,相当于VC中的工具栏停靠。

      

结果先让大家看看:

 (靠!看不到!)

说明:

       在开始停靠的时候我们先了解一下下停靠在Delphi7,在Delphi7中原来就有对Form等有依靠功能,分别是以下属性:

属性

说明

DrawMode

dmAutomatic

是否是拖放

DrawKind

dkDock

拖拽,停靠方法

DockSite

true

是否允许被停靠

 

 

 

了解了以上属性我们再来了解一下下停靠的几个过程:

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);//这是在移动时触发的

4OnStartDock(Sender: TObject;

      var DragObject: TDragDockObject);//开始放工具栏时你希望出现的效果

5OnEndDock(Sender, Target: TObject; X, Y: Integer);//放好工具栏时你希望出现的效果

6OnUnDock(Sender: TObject; Client: TControl;

      NewTarget: TWinControl; var Allow: Boolean);//当你移走你的工具栏时希望有的效果

在以上上面的几个函数最重要的是onDockOver,onDockDropOnUnDock这是必要的东西的几个过程

OnDockOver(Sender: TObject;                 

Source: TDragDockObject;//这是你要停靠的信息信息,其停靠效果全由他来定

      X, Y: Integer; //这是鼠标所在的地方

State: TDragState;//这里可以判断你当前的动作是进入还是移出

 var Accept: Boolean);//Accept这是为false就是不可以停靠,为true就是可以停靠。

 

介绍上了面大家应该还是不很理解吧!那我在进一步解说我说的程序,你可以在我上传的代码中找到你想要的程序(“停靠窗口”)。

我在这里说明我是如何处理的:

       第一步:在MainForm(我的MainForm就是你们的form1)中加入一个LeftDockPanel(是你们的Panel1)再加入一个LeftSplitter(是你们的Splitter)除了MainForm外其他的Align都设置为alLeft全是靠左边的,LeftDockPanelwidth设置为0不要让别人看到他,我们主要是让dockForm(这是你们的form2)放置在LeftDockPanel上,做到一个假的停靠效果。对了属性还没有设置把LeftDockPaneldockSite设置为true让别人可以依靠。DockFormDrawkind设置为dkDock,还有DrawMode设置为dmAutomatic。好累完事了第一步。

       第二步:现在是代码啦

procedure TMainForm.LeftDockPanelDockOver(Sender: TObject;

  Source: TDragDockObject; X, Y: Integer; State: TDragState;

  var Accept: Boolean);

  var

  ARect:TRect;

begin

  Accept:=true;

  ARect.TopLeft:=LeftDockPanel.ClientToScreen(Point(0,0));

  ARect.BottomRight:=LeftDockPanel.ClientToScreen(

  Point(Self.ClientWidth div 3, LeftDockPanel.Height));

  Source.DockRect:=ARect;

end;

 

procedure TMainForm.LeftDockPanelDockDrop(Sender: TObject;

  Source: TDragDockObject; X, Y: Integer);

begin

  LeftDockPanel.Width:=ClientWidth div 3;

  LeftSplitter.Left:=LeftDockPanel.Width+LeftSplitter.Width;

end;

以上代码是在LeftDockPanel中的event找到的DockOverDockDrop两个方法。加上以上代码试一试,MainFormDockForm我就不介绍怎么动态创建了在我上传的代码里面有!

 

 

第三步:不是还有很onunDock没做么!?你自己看着办吧!我的代码里面有!嘻嘻!

 

在这里感谢http://www.host01.com/article/software/Delphi/20060917183659893.htm是他让我知道停靠是多么神奇的!那里面有更细的说明我这里主要是提供一个完整代码供大家参考!

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值