随处拖放的工具栏

在我们经常使用的软件,比如photoshop,office,delphi等等,我们经常可以对工具栏进行拖拽操作----将相关的工具栏拖拉出来,形成独立的小窗口;或者将几个工具栏进行互相的组合!(这些就是我们常说的DOCK功能) 可视化的VCL元件皆支持DOCK功能!  在delphi中,所有继承自Tcontrol及TWinControl的VCL元件,都支持dock功能。   基本上,要进行dock动作至少需要两个元件,一个是被附着的dock site元件,另一个是附着在dock site的元件。DELPHI所提供的可视化元件中只有继承自TWinControl的VCL元件才具有dock site的功能,而只要是继承自Tcontrol的VCL元件则都具有附着在dock site的功能。  * 如果你希望某个继承自TWinControl的元件具有dock site的功能,只要把该元件的属性DockSite设成true即可;  * 若是要把某个继承自TControl的元件附着在dock site上,只要把属性Drag kind设成dkDock、属性DragMode设成dmAutomatic即可。

procedure TForm1.CoolBar1DragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean);
begin
 Accept:=(source=ToolBar1); //指定接受拖拽操作的条件是拖拽对象为ToolBar1;
end;

procedure TForm1.CoolBar1DockDrop(Sender: TObject; Source: TDragDockObject; X, Y: Integer);
begin

 ToolBar1.AutoSize:=false; //当元件拖到dock site元件上面,并且放开鼠标左键之后,此事件就会被执行
 ToolBar1.Align:=altop; //为了便于拖拽,将toolbar1的宽度与coolbar1相近.
 ToolBar1.Width:=CoolBar1.Width-1;
end;

procedure TForm1.CoolBar1UnDock(Sender: TObject; Client: TControl; NewTarget: TWinControl; var Allow: Boolean);
begin 

 ToolBar1.AutoSize:=true; //当元件一拖离dock site元件时,此事就会被执行
 ToolBar1.Caption:='工具栏'; //设定独立工具栏窗口的大小和标题
end;

下面列出与DOCK功能有关的事件:
OnDragDrop: 当元件被拖动时,此事件被执行;
OnDragOver: 用于指定元件可以被拖动的条件;
OnDockDrop: 当元件拖到dock site元件上面,并且放开鼠标左键之后,此事件就会被执行;
OnDockOver:当元件一拖到dock site元件上,此事件就会被执行;
OnUnDock:当元件一拖离dock site元件时,此事就会被执行;
OnGetSiteInfo:取得dock site元件的一些信息。  

 

如果想在当前屏幕位置浮动:  
  procedure   TForm1.Button1Click(Sender:   TObject);  
  var  
      FloatRect:TRect;  
  begin  
      FloatRect.TopLeft:=ToolBar1.ClientToScreen(ToolBar1.ClientRect.TopLeft);  
      FloatRect.BottomRight:=ToolBar1.ClientToScreen(ToolBar1.ClientRect.BottomRight);  
      ToolBar1.ManualFloat(FloatRect);  
  end;

 

消去那个工具栏的关闭按纽
procedure   TFrmMain.ToolBar2EndDock(Sender,   Target:   TObject;   X,   Y:   Integer);
var
    H:   THandle;
begin
    H   :=   GetParent(ToolBar2.Handle);//ToolBar在拖出来之后被“套进”另一个窗口里了
    if   H   <>   CoolBar1.Handle   then   begin//以下的操作都是针对这个临时的父窗口的
        SetWindowLong(H,   GWL_STYLE,   GetWindowLong(H,   GWL_STYLE)   and   not   WS_SYSMENU);//把它的关闭按钮去掉
        ShowWindow(H,   SW_HIDE);//这两句是为了让它刷新,使关闭按钮马上消失
        ShowWindow(H,   SW_SHOW);//如果没有这两句,必须移动一下或者调整一下大小才行
    end;
end;

posted @ 2012-08-07 14:30  马儿快跑  阅读(304)  评论(0编辑  收藏  举报