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

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值