C# WinForm 拖动无边框窗体 改变无边框窗体尺寸

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         }
重写系统WndProc函数

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 }
完整代码

  好了、这次的分享就到这里了、感谢您的支持、、、

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值