将窗体的FormBorderStyles属性设置为None
窗体上放一个新的panel,设置Dock属性为Fill
创建变量
private bool isMouseDown = false;//表示鼠标当前是否处于按下状态,初始值为否 MouseDirection direction = MouseDirection.None;//表示拖动的方向,起始为None,表示不拖动private Point mPoint;//鼠标坐标private bool zhuangtai = true;//是否是改变窗体大小,true为不是,false为是
添加枚举
//定义一个枚举,表示拖动方向public enum MouseDirection{Herizontal,//水平方向拖动,只改变窗体的宽度 Vertical,//垂直方向拖动,只改变窗体的高度 Declining,//倾斜方向,同时改变窗体的宽度和高度None//不做标志,即不拖动窗体改变大小}
panel生成MouseDown事件
private void panel1_MouseDown(object sender, MouseEventArgs e){mPoint = new Point(e.X, e.Y);isMouseDown = true;}
panel生成MouseUp事件
private void panel1_MouseUp(object sender, MouseEventArgs e){// 鼠标弹起,isMouseDown = false;//既然鼠标弹起了,那么就不能再改变窗体尺寸,拖拽方向置 nonedirection = MouseDirection.None;}
panel生成MouseMove事件
private void panel1_MouseMove(object sender, MouseEventArgs e){//鼠标移动过程中,坐标时刻在改变 //当鼠标移动时横坐标距离窗体右边缘5像素以内且纵坐标距离下边缘也在5像素以内时,要将光标变为倾斜的箭头形状,同时拖拽方向direction置为MouseDirection.Declining if (e.Location.X >= this.Width - 5 && e.Location.Y > this.Height - 5){this.Cursor = Cursors.SizeNWSE;direction = MouseDirection.Declining;zhuangtai = false;}else if (e.Location.X >= this.Width - 5)//当鼠标移动时横坐标距离窗体右边缘5像素以内时,要将光标变为倾斜的箭头形状,同时拖拽方向direction置为MouseDirection.Herizontal else if (e.Location.X >= this.Width - 5) {this.Cursor = Cursors.SizeWE;direction = MouseDirection.Herizontal;zhuangtai = false;}else if (e.Location.Y > this.Height - 5)//同理当鼠标移动时纵坐标距离窗体下边缘5像素以内时,要将光标变为倾斜的箭头形状,同时拖拽方向direction置为MouseDirection.Vertical else if (e.Location.Y >= this.Height - 5) {this.Cursor = Cursors.SizeNS;direction = MouseDirection.Vertical;zhuangtai = false;}else{//否则,以外的窗体区域,鼠标星座均为单向箭头(默认) elsethis.Cursor = Cursors.Arrow;zhuangtai = true;}//判断是移动窗口还是拖动窗口大小if (zhuangtai){if (e.Button == MouseButtons.Left){this.Location = new Point(this.Location.X + e.X - mPoint.X, this.Location.Y + e.Y - mPoint.Y);return;}}else{//设定好方向后,调用下面方法,改变窗体大小 ResizeWindow();}}
全部代码
using System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;namespace WindowsFormsApp4{public partial class Form1 : Form{public Form1(){InitializeComponent();}private bool isMouseDown = false;//表示鼠标当前是否处于按下状态,初始值为否 MouseDirection direction = MouseDirection.None;//表示拖动的方向,起始为None,表示不拖动private Point mPoint;//鼠标坐标private bool zhuangtai = true;//是否是改变窗体大小,true为不是,false为是//定义一个枚举,表示拖动方向public enum MouseDirection{Herizontal,//水平方向拖动,只改变窗体的宽度 Vertical,//垂直方向拖动,只改变窗体的高度 Declining,//倾斜方向,同时改变窗体的宽度和高度None//不做标志,即不拖动窗体改变大小}private void panel1_MouseDown(object sender, MouseEventArgs e){mPoint = new Point(e.X, e.Y);isMouseDown = true;}private void panel1_MouseUp(object sender, MouseEventArgs e){// 鼠标弹起,isMouseDown = false;//既然鼠标弹起了,那么就不能再改变窗体尺寸,拖拽方向置 nonedirection = MouseDirection.None;}private void panel1_MouseMove(object sender, MouseEventArgs e){//鼠标移动过程中,坐标时刻在改变 //当鼠标移动时横坐标距离窗体右边缘5像素以内且纵坐标距离下边缘也在5像素以内时,要将光标变为倾斜的箭头形状,同时拖拽方向direction置为MouseDirection.Declining if (e.Location.X >= this.Width - 5 && e.Location.Y > this.Height - 5){this.Cursor = Cursors.SizeNWSE;direction = MouseDirection.Declining;zhuangtai = false;}else if (e.Location.X >= this.Width - 5)//当鼠标移动时横坐标距离窗体右边缘5像素以内时,要将光标变为倾斜的箭头形状,同时拖拽方向direction置为MouseDirection.Herizontal else if (e.Location.X >= this.Width - 5) {this.Cursor = Cursors.SizeWE;direction = MouseDirection.Herizontal;zhuangtai = false;}else if (e.Location.Y > this.Height - 5)//同理当鼠标移动时纵坐标距离窗体下边缘5像素以内时,要将光标变为倾斜的箭头形状,同时拖拽方向direction置为MouseDirection.Vertical else if (e.Location.Y >= this.Height - 5) {this.Cursor = Cursors.SizeNS;direction = MouseDirection.Vertical;zhuangtai = false;}else{//否则,以外的窗体区域,鼠标星座均为单向箭头(默认) elsethis.Cursor = Cursors.Arrow;zhuangtai = true;}//设定好方向后,调用下面方法,改变窗体大小 if (zhuangtai){if (e.Button == MouseButtons.Left){this.Location = new Point(this.Location.X + e.X - mPoint.X, this.Location.Y + e.Y - mPoint.Y);return;}}else{ResizeWindow();}}private void ResizeWindow(){//这个判断很重要,只有在鼠标按下时才能拖拽改变窗体大小,如果不作判断,那么鼠标弹起和按下时,窗体都可以改变 if (!isMouseDown)return;//MousePosition的参考点是屏幕的左上角,表示鼠标当前相对于屏幕左上角的坐标this.left和this.top的参考点也是屏幕,属性MousePosition是该程序的重点if (direction == MouseDirection.Declining){//此行代码在mousemove事件中已经写过,在此再写一遍,并不多余,一定要写this.Cursor = Cursors.SizeNWSE;//下面是改变窗体宽和高的代码,不明白的可以仔细思考一下this.Width = MousePosition.X - this.Left;this.Height = MousePosition.Y - this.Top;}//以下同理if (direction == MouseDirection.Herizontal){this.Cursor = Cursors.SizeWE;this.Width = MousePosition.X - this.Left;}else if (direction == MouseDirection.Vertical){this.Cursor = Cursors.SizeNS;this.Height = MousePosition.Y - this.Top;}//即使鼠标按下,但是不在窗口右和下边缘,那么也不能改变窗口大小 else {this.Cursor = Cursors.Arrow;}}}}
项目源文件
/download/qq_37341685/72212588