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;//既然鼠标弹起了,那么就不能再改变窗体尺寸,拖拽方向置 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上拖动窗口位置,改变窗口大小相关推荐
- C# WinForm 无边框窗体,加阴影、拖动、改变大小等功能完美实现(自认为是完美的 ^=^)
关于Winform的无边框窗体实现,网络上有很多大牛文章,这里不赘述.我也是参考网络上的思路,在使用别人的代码基础上,发现和遇到了很多小问题,所以做了改造,以下做个记录,也是给需要的人提供一点思路,如 ...
- WinForm 无边框窗体 拖动工作区移动窗体
方案1 : 通过重载消息处理实现.重写窗口过程(WndProc),处理一些非客户区消息(WM_NCxxxx),C#中重写窗口过程不用再调用SetWindowLong API了,直接overide一个W ...
- 再谈winform无边框窗体的鼠标托动与缩放
在winform经常用到无边框的窗体,原因就是想使自己的程序界面完全的自定义,网上也有过不少的相关资料 今天我发了一下的午的时间整理了一下.觉得还不错,贴出来看看. 为了提高托动的缩放的效率,减少系统 ...
- 解决 WPF 嵌套的子窗口在改变窗口大小的时候闪烁的问题
因为 Win32 的窗口句柄是可以跨进程传递的,所以可以用来实现跨进程 UI.不过,本文不会谈论跨进程 UI 的具体实现,只会提及其实现中的一个重要缓解,使用子窗口的方式. 你有可能在使用子窗口之后, ...
- C#:WinForm无边框窗体移动方法、模仿鼠标单击标题栏移动窗体位置
方法一:直接通过修改窗体位置从而达到移动窗体的效果 方法二:直接伪装发送单击任务栏消息,让应用程序误以为单击任务栏从而移动窗体 方法一 1.定义一个位置信息Point用于存储鼠标位置 private ...
- WPF无边框拖动、全屏、缩放
原文:WPF无边框拖动.全屏.缩放 版权声明:本文为博主原创文章,转载请注明出处. https://blog.csdn.net/lwwl12/article/details/78059361 先看效果 ...
- python小技巧大应用--基础实用漂亮界面(无边框,圆角,可拖拽)
这回要实现一个漂亮的基础界面,要具有如下特色: 无边框,圆角,漂亮的背景,可拖拽移动,具有最小化,关闭按钮,界面与代码分离,支持qss 先展示一下最后的效果: 那就开始工作吧: 1.通过Qt Desi ...
- Electron无边框窗口(最小化、最大化、关闭、拖动)以及动态改变窗口大小
文章目录 一.目标原型 1. 目标 2. 原型设计 3. 原型初步实现 二.无边框窗口 1. 要点 2. 改造 三.可拖拽区 1. 要点 2. 改造 四.最小化.最大化.关闭 1. 要点 2. 改造 ...
- 【最终版】PyQt5 自定义标题栏,实现无边框,最小化最大化关闭事件,窗口拖动移动,窗口改变大小,仿百度网盘色调美化,添加内容窗口
[最终版]PyQt5 自定义标题栏,实现无边框,最小化最大化关闭事件,窗口拖动移动,窗口改变大小,仿百度网盘色调美化,添加内容窗口 文章目录 [最终版]PyQt5 自定义标题栏,实现无边框,最小化最大 ...
最新文章
- 为什么升级不了android版本,为啥你的手机无法升级到安卓7.0?原因都在这里!...
- 当 python Pip 升级失败
- LINUX内核经典面试题30道及解答
- 平民软件OneProxy的强大
- HTML5 本地文件操作之FileSystemAPI整理(一)
- vs编译项目报错:The OutputPath property is not set for this project
- 嵌套循环连接,哈希连接,排序合并连接(2015-2-4学习日记)
- 位操作在算法中的运用
- Linux sed替换内容中有空格解决办法
- 安装hadoop-2.3.0-cdh5.1.2全过程
- 央行变相降准祭出又一新手段 引发同业套利之忧
- 关于Jeecg互联网化dubbo改造方案(下)
- ubuntu linux 使用常见问题
- FPGA中case语句4选1数据选择器
- MySql常用SQL语句
- 5种方法,加密你的Python代码 !
- 绝知此事要躬行|fatal: not in a git directoryError: Command failed with exit 128: git
- SaaS产品移动化,你想好这3点了吗
- python拼多多领现金_拼多多天天领现金最后都是1分怎么办?
- php 定义宏函数,汇编语言宏函数