C# winform无边框窗体移动的四种方法
一、重写WndProc
protected override void WndProc(ref Message m) { const int WM_NCHITTEST = 0x84; const int HTCLIENT = 0x01; const int HTCAPTION = 0x02; if (m.Msg == WM_NCHITTEST) { this.DefWndProc(ref m); if (m.Result.ToInt32() == HTCLIENT) m.Result = new IntPtr(HTCAPTION); else base.WndProc(ref m); } else { base.WndProc(ref m); } }
GarsonZhang www.yesdotnet.com
二、创建消息
private const int WM_NCLBUTTONDOWN = 0x00A1; private const int WM_NCHITTEST = 0x84; private const int HT_CAPTION = 0x2; private const int HT_CLIENT = 0x1; private void pictureBox1_MouseDown(object sender, MouseEventArgs e) { //this.Capture = false; pictureBox1.Capture = false; Message msg = Message.Create(Handle, WM_NCLBUTTONDOWN, (IntPtr)HT_CAPTION, IntPtr.Zero); WndProc(ref msg); }
GarsonZhang www.yesdotnet.com
三、调用API代码
using System.Runtime.InteropServices; [DllImport("user32.dll")] public static extern bool ReleaseCapture(); [DllImport("user32.dll")] public static extern bool SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam); public const int WM_SYSCOMMAND = 0x0112; public const int SC_MOVE = 0xF010; public const int HTCAPTION = 0x0002; //在窗体的_MouseDown中加入如下代码:
如: private void Form1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e) { ReleaseCapture(); SendMessage(this.Handle, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0); }
GarsonZhang www.yesdotnet.com
四、鼠标事件:MouseDown, MouseMove, MouseUp
/// <summary> /// 拖动鼠标移动窗体Form通用类 /// </summary> public class FormDragDrop { /// <summary> /// 窗体拖动注册类 /// </summary> /// <param name="form">窗体对象</param> /// <param name="col">拖动控件对象,空的话代表拖动窗体</param> public static void Register(Form form, Control col = null) { FormDragDrop F = new FormDragDrop(form, col); F.Init(); } private Point _MouseOffset; private bool _IsMouseDown = false; private Form _form; private Control _control; private FormDragDrop(Form form, Control col = null) { _form = form; _control = col; } private void Init() { Control col = _control != null ? _control : _form; col.MouseDown += On_MouseDown; col.MouseMove += On_MouseMove; col.MouseUp += On_MouseUp; } private void On_MouseDown(object sender, MouseEventArgs e) { int xOffset; int yOffset; if (e.Button == MouseButtons.Left) { xOffset = -e.X; yOffset = -e.Y; _MouseOffset = new Point(xOffset, yOffset); _IsMouseDown = true; } } private void On_MouseMove(object sender, MouseEventArgs e) { if (_IsMouseDown) { Point mousePos = Control.MousePosition; mousePos.Offset(_MouseOffset.X, _MouseOffset.Y); _form.Location = mousePos; } } private void On_MouseUp(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { _IsMouseDown = false; } } }
GarsonZhang www.yesdotnet.com
使用方法:
在窗体Load事件中调用方法,启用鼠标拖拽移动窗体
// 注册鼠标拖拽移动窗体
FormDragDrop.Register(this, this.panelControl1);
版权声明:本文为YES开发框架网发布内容,转载请附上原文出处连接
post YES开发框架