将窗体的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 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;//既然鼠标弹起了,那么就不能再改变窗体尺寸,拖拽方向置 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;}}}
}

项目源文件
https://download.csdn.net/download/qq_37341685/72212588

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

  1. C# WinForm 无边框窗体,加阴影、拖动、改变大小等功能完美实现(自认为是完美的 ^=^)

    关于Winform的无边框窗体实现,网络上有很多大牛文章,这里不赘述.我也是参考网络上的思路,在使用别人的代码基础上,发现和遇到了很多小问题,所以做了改造,以下做个记录,也是给需要的人提供一点思路,如 ...

  2. WinForm 无边框窗体 拖动工作区移动窗体

    方案1 : 通过重载消息处理实现.重写窗口过程(WndProc),处理一些非客户区消息(WM_NCxxxx),C#中重写窗口过程不用再调用SetWindowLong API了,直接overide一个W ...

  3. 再谈winform无边框窗体的鼠标托动与缩放

    在winform经常用到无边框的窗体,原因就是想使自己的程序界面完全的自定义,网上也有过不少的相关资料 今天我发了一下的午的时间整理了一下.觉得还不错,贴出来看看. 为了提高托动的缩放的效率,减少系统 ...

  4. 解决 WPF 嵌套的子窗口在改变窗口大小的时候闪烁的问题

    因为 Win32 的窗口句柄是可以跨进程传递的,所以可以用来实现跨进程 UI.不过,本文不会谈论跨进程 UI 的具体实现,只会提及其实现中的一个重要缓解,使用子窗口的方式. 你有可能在使用子窗口之后, ...

  5. C#:WinForm无边框窗体移动方法、模仿鼠标单击标题栏移动窗体位置

    方法一:直接通过修改窗体位置从而达到移动窗体的效果 方法二:直接伪装发送单击任务栏消息,让应用程序误以为单击任务栏从而移动窗体 方法一 1.定义一个位置信息Point用于存储鼠标位置 private ...

  6. WPF无边框拖动、全屏、缩放

    原文:WPF无边框拖动.全屏.缩放 版权声明:本文为博主原创文章,转载请注明出处. https://blog.csdn.net/lwwl12/article/details/78059361 先看效果 ...

  7. python小技巧大应用--基础实用漂亮界面(无边框,圆角,可拖拽)

    这回要实现一个漂亮的基础界面,要具有如下特色: 无边框,圆角,漂亮的背景,可拖拽移动,具有最小化,关闭按钮,界面与代码分离,支持qss 先展示一下最后的效果: 那就开始工作吧: 1.通过Qt Desi ...

  8. Electron无边框窗口(最小化、最大化、关闭、拖动)以及动态改变窗口大小

    文章目录 一.目标原型 1. 目标 2. 原型设计 3. 原型初步实现 二.无边框窗口 1. 要点 2. 改造 三.可拖拽区 1. 要点 2. 改造 四.最小化.最大化.关闭 1. 要点 2. 改造 ...

  9. 【最终版】PyQt5 自定义标题栏,实现无边框,最小化最大化关闭事件,窗口拖动移动,窗口改变大小,仿百度网盘色调美化,添加内容窗口

    [最终版]PyQt5 自定义标题栏,实现无边框,最小化最大化关闭事件,窗口拖动移动,窗口改变大小,仿百度网盘色调美化,添加内容窗口 文章目录 [最终版]PyQt5 自定义标题栏,实现无边框,最小化最大 ...

最新文章

  1. 为什么升级不了android版本,为啥你的手机无法升级到安卓7.0?原因都在这里!...
  2. 当 python Pip 升级失败
  3. LINUX内核经典面试题30道及解答
  4. 平民软件OneProxy的强大
  5. HTML5 本地文件操作之FileSystemAPI整理(一)
  6. vs编译项目报错:The OutputPath property is not set for this project
  7. 嵌套循环连接,哈希连接,排序合并连接(2015-2-4学习日记)
  8. 位操作在算法中的运用
  9. Linux sed替换内容中有空格解决办法
  10. 安装hadoop-2.3.0-cdh5.1.2全过程
  11. 央行变相降准祭出又一新手段 引发同业套利之忧
  12. 关于Jeecg互联网化dubbo改造方案(下)
  13. ubuntu linux 使用常见问题
  14. FPGA中case语句4选1数据选择器
  15. MySql常用SQL语句
  16. 5种方法,加密你的Python代码 !
  17. 绝知此事要躬行|fatal: not in a git directoryError: Command failed with exit 128: git
  18. SaaS产品移动化,你想好这3点了吗
  19. python拼多多领现金_拼多多天天领现金最后都是1分怎么办?
  20. php 定义宏函数,汇编语言宏函数

热门文章

  1. 生日python十种日期格式_生日,日期,天数,时间戳
  2. 拟牛顿法之BFGS算法
  3. tcp/ip五层协议模型
  4. vue移动端适配方案
  5. Win2003全面优化配置
  6. 小项目:单片机控制脉搏心电测量仪 测量脉搏心跳 含程序 原理图及仿真文件
  7. PAT L1 043 阅览室
  8. h3cr300刷第三方固件_蒲公英路由器刷第三方固件(一)
  9. chromium gn parameter list
  10. EtherCAT小体积直流伺服驱控器ELMO智能直流伺服驱动器COPLEY驱动器