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

来源:互联网 发布:重庆软件测试招聘 编辑:程序博客网 时间:2024/05/17 23:00

首先需要先設定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;    }}
VBPrivate 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    NextEnd 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


转载地址    http://www.dotblogs.com.tw/yc421206/archive/2010/06/21/16039.aspx

原创粉丝点击