[C#.NET][VB.NET] 程式執行時拖曳控制項

[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; 
    }
}

以上範例是當滑鼠右鍵按下不放,進行拖曳時所展現的效果。我們可以看到滑鼠拖曳時的特效圖形image

這是 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#範例下載

ControlMoves.zip

 

參考資料

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

Image result for microsoft+mvp+logo