C# 实现窗体移动

一般情况下:

1 1.添加下列代码到你的窗体中:
2 #region 轻松移动
3
4 bool isInMove;
5 Point oldPoint;
6
7 void InitializeEasyMove()
8 {
9 isInMove = false;
10
11 this.MouseDown += new MouseEventHandler(EasyMove_MouseDown);
12 this.MouseUp += new MouseEventHandler(EasyMove_MouseUp);
13 this.MouseMove += new MouseEventHandler(EasyMove_MouseMove);
14 }
15
16 void EasyMove_MouseMove(object sender, MouseEventArgs e)
17 {
18 if (!isInMove) return;
19 Point pt = PointToScreen(e.Location);
20 if (pt.X == oldPoint.X || pt.Y == oldPoint.Y) return;
21 this.Location = new Point(this.Location.X + pt.X - oldPoint.X, this.Location.Y + pt.Y - oldPoint.Y);
22 oldPoint = pt;
23 }
24
25 void EasyMove_MouseUp(object sender, MouseEventArgs e)
26 {
27 isInMove = false;
28 }
29
30 void EasyMove_MouseDown(object sender, MouseEventArgs e)
31 {
32 isInMove = true;
33 oldPoint = PointToScreen(e.Location);
34 }
35
36 #endregion
37
38 2.在你的窗体的构造函数或Load事件中调用:
39 InitializeEasyMove();

但是你会发现这样很麻烦,运行时也容易出错。

改进一:

增加mouseleave事件,当mouseleave的时候把isInMove 设置成false

这样虽然改进了一点。但是还有有点别扭

改进二:

使用win32api

1 public partial class Form6 : Form
2 {
3 [DllImport(“user32.dll”)]
4 public static extern bool ReleaseCapture();
5 [DllImport(“user32.dll”)]
6 public static extern bool SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);
7 public const int WM_SYSCOMMAND = 0x0112;
8 public const int SC_MOVE = 0xF010;
9 public const int HTCAPTION = 0x0002;
10
11 public Form6()
12 {
13 InitializeComponent();
14 }
15
16 private void Form6_MouseDown(object sender, MouseEventArgs e)
17 {
18 ReleaseCapture();
19 SendMessage(this.Handle, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0);
20 }
21 }

代码量大大减少,直接消除鼠标移快速移动时出现bug的现象。但是当鼠标点击pannel,groupbox等还是没有反应

改进三:

1 public partial class Form1 : Form
2 {
3 [DllImport(“user32.dll”)]
4 public static extern bool ReleaseCapture();
5 [DllImport(“user32.dll”)]
6 public static extern bool SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);
7 public const int WM_SYSCOMMAND = 0x0112;
8 public const int SC_MOVE = 0xF010;
9 public const int HTCAPTION = 0x0002;
10 public Form1()
11 {
12 InitializeComponent();
13 foreach (var item in this.Controls)
14 {
15 if ((item as GroupBox) != null)
16 {
17 (item as GroupBox).MouseDown += Form6_MouseDown;
18 }
19 else if ((item as Panel) != null)
20 {
21 (item as Panel).MouseDown += Form6_MouseDown;
22 }
23 }
24 }
25
26 private void Form6_MouseDown(object sender, MouseEventArgs e)
27 {
28 ReleaseCapture();
29 SendMessage(this.Handle, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0);
30 }
31 }

将GroupBox ,pannel等控件添加mousedown动作

项目使用中
原作者

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值