随处拖放的工具栏
在我们经常使用的软件,比如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;