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

来源:互联网 发布:阿松手办淘宝 编辑:程序博客网 时间:2024/06/05 06:50

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 Demo11 {12     public partial class Frm_Main : Form13     {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 }
完整代码

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

0 0
原创粉丝点击