winform无边框在panel上拖动窗口位置,改变窗口大小

在这里插入图片描述
将窗体的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

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值