C# WinForm 拖动无边框窗体 改变无边框窗体尺寸
经常遇到这种情况、窗体的边框去掉了、然后种种问题就出来了:
不能拖动、
不能改变窗体大小、
不能......
当然、肯定有解决方案滴*^_^*
今天的目标就是:
可以直接拖动没有边框的窗体、
可以直接拉拽窗体改变其大小、
制作步骤如下:
新建WinForm程序、添加一个启动的窗体、
将其边框设置为None、
进入代码编辑界面、
定义如下常量值:
1 const int Guying_HTLEFT = 10;
2 const int Guying_HTRIGHT = 11;
3 const int Guying_HTTOP = 12;
4 const int Guying_HTTOPLEFT = 13;
5 const int Guying_HTTOPRIGHT = 14;
6 const int Guying_HTBOTTOM = 15;
7 const int Guying_HTBOTTOMLEFT = 0x10;
8 const int Guying_HTBOTTOMRIGHT = 17;
重写系统WndProc函数:
1 protected override void WndProc(ref Message m)
2 {
3 switch (m.Msg)
4 {
5 case 0x0084:
6 base.WndProc(ref m);
7 Point vPoint = new Point((int)m.LParam & 0xFFFF,
8 (int)m.LParam >> 16 & 0xFFFF);
9 vPoint = PointToClient(vPoint);
10 if (vPoint.X <= 5)
11 if (vPoint.Y <= 5)
12 m.Result = (IntPtr)Guying_HTTOPLEFT;
13 else if (vPoint.Y >= ClientSize.Height - 5)
14 m.Result = (IntPtr)Guying_HTBOTTOMLEFT;
15 else m.Result = (IntPtr)Guying_HTLEFT;
16 else if (vPoint.X >= ClientSize.Width - 5)
17 if (vPoint.Y <= 5)
18 m.Result = (IntPtr)Guying_HTTOPRIGHT;
19 else if (vPoint.Y >= ClientSize.Height - 5)
20 m.Result = (IntPtr)Guying_HTBOTTOMRIGHT;
21 else m.Result = (IntPtr)Guying_HTRIGHT;
22 else if (vPoint.Y <= 5)
23 m.Result = (IntPtr)Guying_HTTOP;
24 else if (vPoint.Y >= ClientSize.Height - 5)
25 m.Result = (IntPtr)Guying_HTBOTTOM;
26 break;
27 case 0x0201: //鼠标左键按下的消息
28 m.Msg = 0x00A1; //更改消息为非客户区按下鼠标
29 m.LParam = IntPtr.Zero; //默认值
30 m.WParam = new IntPtr(2);//鼠标放在标题栏内
31 base.WndProc(ref m);
32 break;
33 default:
34 base.WndProc(ref m);
35 break;
36 }
37 }
OK、运行一下看看效果吧、可以拖动、可以拖拽窗体改变尺寸、、、
呵呵、
完整代码如下:
1 using System;
2 using System.Collections.Generic;
3 using System.ComponentModel;
4 using System.Data;
5 using System.Drawing;
6 using System.Linq;
7 using System.Text;
8 using System.Windows.Forms;
9
10 namespace Demo
11 {
12 public partial class Frm_Main : Form
13 {
14 public Frm_Main()
15 {
16 InitializeComponent();
17 StartPosition = FormStartPosition.CenterScreen;
18 this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
19 }
20
21 const int Guying_HTLEFT = 10;
22 const int Guying_HTRIGHT = 11;
23 const int Guying_HTTOP = 12;
24 const int Guying_HTTOPLEFT = 13;
25 const int Guying_HTTOPRIGHT = 14;
26 const int Guying_HTBOTTOM = 15;
27 const int Guying_HTBOTTOMLEFT = 0x10;
28 const int Guying_HTBOTTOMRIGHT = 17;
29
30 protected override void WndProc(ref Message m)
31 {
32 switch (m.Msg)
33 {
34 case 0x0084:
35 base.WndProc(ref m);
36 Point vPoint = new Point((int)m.LParam & 0xFFFF,
37 (int)m.LParam >> 16 & 0xFFFF);
38 vPoint = PointToClient(vPoint);
39 if (vPoint.X <= 5)
40 if (vPoint.Y <= 5)
41 m.Result = (IntPtr)Guying_HTTOPLEFT;
42 else if (vPoint.Y >= ClientSize.Height - 5)
43 m.Result = (IntPtr)Guying_HTBOTTOMLEFT;
44 else m.Result = (IntPtr)Guying_HTLEFT;
45 else if (vPoint.X >= ClientSize.Width - 5)
46 if (vPoint.Y <= 5)
47 m.Result = (IntPtr)Guying_HTTOPRIGHT;
48 else if (vPoint.Y >= ClientSize.Height - 5)
49 m.Result = (IntPtr)Guying_HTBOTTOMRIGHT;
50 else m.Result = (IntPtr)Guying_HTRIGHT;
51 else if (vPoint.Y <= 5)
52 m.Result = (IntPtr)Guying_HTTOP;
53 else if (vPoint.Y >= ClientSize.Height - 5)
54 m.Result = (IntPtr)Guying_HTBOTTOM;
55 break;
56 case 0x0201: //鼠标左键按下的消息
57 m.Msg = 0x00A1; //更改消息为非客户区按下鼠标
58 m.LParam = IntPtr.Zero; //默认值
59 m.WParam = new IntPtr(2);//鼠标放在标题栏内
60 base.WndProc(ref m);
61 break;
62 default:
63 base.WndProc(ref m);
64 break;
65 }
66 }
67 }
68 }
好了、这次的分享就到这里了、感谢您的支持、、、