将窗体的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;
//既然鼠标弹起了,那么就不能再改变窗体尺寸,拖拽方向置 none
direction = 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
{
//否则,以外的窗体区域,鼠标星座均为单向箭头(默认) else
this.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 System.ComponentModel;
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;
//既然鼠标弹起了,那么就不能再改变窗体尺寸,拖拽方向置 none
direction = 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
{
//否则,以外的窗体区域,鼠标星座均为单向箭头(默认) else
this.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;
}
}
}
}
项目源文件
https://download.csdn.net/download/qq_37341685/72212588