[C#.NET][VB.NET] 程式執行時拖曳控制項
首先需要先設定Form.AllowDrop=true;
在Form中的每一個控制項需要 MouseMove 事件,所以我們用Code為每個控制項加事件
C# private void Form1_Load(object sender, EventArgs e) { //為每個控制項加事件 foreach (Control ctrl in Controls) { ctrl.MouseMove += ctrl_MouseMove; ctrl.MouseDown += ctrl_MouseDown; } }
VB Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load '為每個控制項加事件 For Each ctrl As Control In Controls AddHandler ctrl.MouseDown, AddressOf ctrl_MouseDown AddHandler ctrl.MouseMove, AddressOf ctrl_MouseMove Next End Sub
在MouseMove事件發生時,當控制項拖曳時,所要產生的圖形效果。DragDropEffects 列舉型別
void ctrl_MouseMove(object sender, MouseEventArgs e) { Control ctrl = sender as Control; if (ctrl.Capture && e.Button == MouseButtons.Right) { DoDragDrop(ctrl, DragDropEffects.Move);//定義拖曳圖示 } }
這時Form還不知道你要對哪個控制項做處理,接下來我們要在 Form.DragEnter 事件中加入
Control _ctrl = null;//存放被拖曳的控制項 private void Form1_DragEnter(object sender, DragEventArgs e) { //取出被拖曳的控制項 _ctrl = e.Data.GetData(e.Data.GetFormats(true)[0]) as Control; if (_ctrl != null) e.Effect = (_ctrl == null) ? DragDropEffects.None : DragDropEffects.Move; }
這時需要用 e.Data.GetData() 方法取出是哪個控制項被拖了。感謝 Larry 支援改寫!
再來,決定完成拖曳時,控制項應出現的座標
private void Form1_DragDrop(object sender, DragEventArgs e) { if (_ctrl != null) { _ctrl.Top = this.PointToClient(new Point(e.X, e.Y)).Y; _ctrl.Left = this.PointToClient(new Point(e.X, e.Y)).X; } }
以上範例是當滑鼠右鍵按下不放,進行拖曳時所展現的效果。我們可以看到滑鼠拖曳時的特效圖形![]()
這是 DragDropEffects 列舉型別 所展現的結果,若有興趣可以自行玩玩其它型態。
若你想要看到控制被你拖著跑的效果
我們還需要MouseDown 事件,在MouseDown事件觸發時,記錄控制項目前的位置。
private MouseEventArgs _pos = null; void ctrl_MouseDown(object sender, MouseEventArgs e) { if (e.Button==MouseButtons.Right) { _pos = e;//按下時記錄位置 } }
並將ctrl_MouseMove事件改成以下
void ctrl_MouseMove(object sender, MouseEventArgs e) { Control ctrl = sender as Control; if (ctrl.Capture && e.Button == MouseButtons.Right) { //DoDragDrop(ctrl, DragDropEffects.Move);//定義拖曳圖示 ctrl.Top = e.Y + ctrl.Location.Y - _pos.Y; ctrl.Left = e.X + ctrl.Location.X - _pos.X; } }
VB,C#範例下載
參考資料
http://itgroup.blueshop.com.tw/HammerChou/PowerHammer?n=convew&i=11668
http://www.dotblogs.com.tw/larrynung/archive/2010/06/20/16012.aspx
本文转自http://www.dotblogs.com.tw/yc421206/archive/2010/06/21/16039.aspx


浙公网安备 33010602011771号