Delphi中停靠技術的實作:
隨著軟體技術的不斷進步,軟體介面也越來越美觀,操作也越來越方便。
綜觀市面上比較專業的各種軟體,我們會發現大部分都提供窗體停靠的功能,特別象工具軟體,基本上都或多或少有停靠功能。
自然,Delphi也支持停靠,而且她和VCL緊密結合,對於廣大的Delphi程式設計師來說更是一大福音。讓我們省去枯燥的編碼時間。把注意力集中在核心程序的構思上。
先讓我們來複習一下VCL的結構,在TWinControl類別中有一個DockSite屬性(boolean),它的作用是是否允許別的控件停靠在它的上面,在TControl類別中有一個DragKind屬性,如果要這個控件能停在別的控制上,就把DragKind屬性設為dkDock。就這麼簡單,只要設定一下屬性,一個支援停靠的程式就完成了。
當然,上面說的只是最基本的步驟,有了以上兩步,我們就可以繼續寫程式碼實現更複雜的功能。
一般的支援停靠的程式都可以在主視窗的上下左右停靠,也就是說在主視窗的邊上放上能被停靠的控制項比較好(只要是從TWinControl繼承的都行),一般我們都選擇TPanel ,為了便於讀者理解,我們可以假定主視窗的左邊可以停靠,所以在主視窗上放一個Align屬性為a lLeft的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; var Accept: Boolean);
2. OnDockDrop(Sender: TObject; Source: TDragDockObject;
X, Y: Integer);
3. OnGetSiteInfo(Sender: TObject; DockClient: TControl;
var InfluenceRect: TRect; MousePos: TPoint; var CanDock: Boolean);
4. OnStartDock(Sender: TObject;
var DragObject: TDragDockObject);
5. OnEndDock(Sender, Target: TObject; X, Y: Integer);
6. OnUnDock(Sender: TObject; Client: TControl;
NewTarget: TWinControl; var Allow: Boolean);
哇,這麼多,別急,讓我細細道來:
先讓我們來看看第一個事件
OnDockOver是在停靠控制(DockableForm)掠過被停靠控制(LeftDockPanel)時觸發的。 Source包含了停靠—拖曳操作的訊息,其中有一個重要的屬性是Control,就是DockableForm,另一個重要的屬性是DockRect,就是停靠的位置;X,Y是滑鼠的位置,State的狀態有dsDragEnter, dsDragLeave, dsDragMove,分別表示拖曳進入,拖曳離開,拖曳移動;Accept是是否同意停靠的意思。 OnDockOver事件主要作用是控制停靠窗體的預覽位置,下面我們來加入以下程式碼: