[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
若有謬誤,煩請告知,新手發帖請多包涵
Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET