[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; }}
以上範例是當滑鼠右鍵按下不放,進行拖曳時所展現的效果。我們可以看到滑鼠拖曳時的特效圖形
這是 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
- [C#.NET][VB.NET] 程式執行時拖曳控制項
- 【转】[C#.NET][VB.NET] 用 Win32 API 控制 外部應用程式選單
- [C#.NET][VB.NET] Process 類別 / 如何 列舉執行中的程式
- VB.NET 获取程式路径
- 感温报警程式源码(vb.net)
- 程式执行——vb.net
- ListView 控制 VB.net
- vb.net 鼠标控制
- [VB.NET]求vb.net声道控制
- VB.NET&C#&VB较量
- C#and VB.net
- [VB.NET]控制图形移动
- [VB.NET]轻松控制Word
- [VB.NET]轻松控制Excel
- [VB.NET]访问控制面板
- [VB.Net]服务控制管理器
- [VB.NET源码]文件系统及屏幕保护程式
- winform实现拖曳功能。.net拖曳实现 drag
- HDU 1671
- 3D printer controller software for BeagleBone with BeBoPr Cape.
- MyBatis3整合Spring3、SpringMVC3
- [+补充]多进程及多线程
- 如何彻底清除MySQL
- [C#.NET][VB.NET] 程式執行時拖曳控制項
- poj 2455 二分+最大流
- NHibernate 3.2或以上的版本就没有 NHibernate.ByteCode.Castle.dll,NHibernate.ByteCode.LinFu.dll, NHibernate.Byt
- 寻找N个元素中最大的K个元素解法
- Linux man 命令后面的圆括号的意义
- fedora下dns的配置
- JAVA里面关于byte数组和String之间的转换问题
- V4L2 深入理解
- Linux命令