Winform无边框窗体拖动功能实现

1. 设置无边框模式

选中要去除边框的窗体,按F4调出其属性面板,在属性面板中找到 FormBorderStyle ,并选择 ​None,即可将窗体设置成无边框模式;默认是无法随意拖动的,也没有最大化最小化关闭按钮。

2. 通过Panel控件实现窗体移动

实现方法 :在窗体的头部添加 Panel 控件,通过 Panel 的 MouseDown、MouseMove 事件实现窗体移动;(这里的话可以添加一个背景色更好)

实现原理: 直接通过修改窗体位置从而达到移动窗体的效果;

代码实现:

//定义一个位置信息Point用于存储鼠标位置
private Point mpoint;
/// <summary>
/// 鼠标移动事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void panel1_MouseMove(object sender, MouseEventArgs e)
{if (e.Button == MouseButtons.Left){this.Location = new Point(this.Location.X + e.X - mpoint.X, this.Location.Y + e.Y - mpoint.Y);}
}
/// <summary>
/// 鼠标按下事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void panel1_MouseDown(object sender, MouseEventArgs e)
{mpoint = new Point(e.X, e.Y);
}

3. 通过窗体事件实现窗体移动

实现方法:通过窗体MouseDown、MouseMove、MouseUp事件实现窗体移动;

代码演示:

//定义一个位置信息Point用于存储鼠标位置
private Point mpoint;
// 定义一个bool变量用于判断鼠标是否按下
private bool isMouseDown = false;/// <summary>
/// 鼠标释放事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Form1_MouseDown(object sender, MouseEventArgs e)
{// 鼠标左键按下mpoint = e.Location;// 记录鼠标按下状态if (e.Button == MouseButtons.Left){isMouseDown = true;}
}
/// <summary>
/// 鼠标移动事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Form1_MouseMove(object sender, MouseEventArgs e)
{if(e.Button == MouseButtons.Left && isMouseDown){Location += new Size(e.Location.X - mpoint.X, e.Location.Y - mpoint.Y);}
}
/// <summary>
/// 鼠标释放事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Form1_MouseUp(object sender, MouseEventArgs e)
{isMouseDown = false; // 鼠标左键释放
}

3.1. 前提准备

private Point mpoint;          // 用来记住“鼠标刚按下去时,在窗体内的位置”
private bool isMouseDown = false; // 标记“鼠标是不是正按着”

比如你点在窗体标题栏(或任意位置)的 (50, 30) 处,mpoint 就记下这个点。


3.2. 1️⃣ 鼠标按下时(MouseDown

private void Form1_MouseDown(object sender, MouseEventArgs e)
{mpoint = e.Location; // 记录:鼠标在窗体内的坐标(比如 (50,30))if (e.Button == MouseButtons.Left){isMouseDown = true; // 标记:现在鼠标左键按下了}
}

✅ ​作用

  • 记住你“从哪里开始拖”
  • 告诉程序:“我要开始拖窗体了!”

3.3. 2️⃣ 鼠标移动时(MouseMove

private void Form1_MouseMove(object sender, MouseEventArgs e)
{if (e.Button == MouseButtons.Left && isMouseDown){Location += new Size(e.Location.X - mpoint.X, e.Location.Y - mpoint.Y);}
}

关键逻辑拆解

  • e.Location:当前鼠标在窗体内部的坐标(比如现在移到了 (60, 40))
  • mpoint:最初按下的位置(比如 (50, 30))
  • e.Location - mpoint = (10, 10) → 表示鼠标相对于按下点,移动了多少

于是:

Location += new Size(10, 10);

就是把​整个窗体的位置向右下移动 10 像素

每次鼠标一动,就计算“偏移量”,然后让窗体跟着偏移 —— ​看起来就像你拖着窗体走

为什么用 Location += ...
因为 Location 是窗体左上角在屏幕上的坐标。加一个偏移量,窗体就跟着动。


3.4. 3️⃣ 鼠标松开时(MouseUp

private void Form1_MouseUp(object sender, MouseEventArgs e)
{isMouseDown = false; // 标记:鼠标松开了,停止拖拽
}

✅ ​作用

  • 告诉程序:“我不拖了!”
  • 下次再移动鼠标,MouseMove 里的 if 条件不成立,窗体就不会乱跑了

3.5. 整体流程(举个栗子)

  1. 你在窗体上 (50, 30) 处按下鼠标左键
    mpoint = (50, 30)isMouseDown = true
  2. 你把鼠标拖到 (80, 60)
    e.Location = (80, 60)
    → 偏移量 = (80-50, 60-30) = (30, 30)
    Location += (30, 30) → 窗体整体右移 30、下移 30
  3. 你松开鼠标
    isMouseDown = false
    → 再移动鼠标,窗体不动了

3.6. ⚠️ 注意事项

  • 这段代码通常用在 ​无边框窗体FormBorderStyle = None)上,因为默认窗体可以拖标题栏移动,不需要自己实现。
  • 如果窗体有标题栏,这样写会导致“点哪都能拖”,可能不符合用户习惯。
  • Location 改变的是窗体在​屏幕上的绝对位置,不是相对位置。

3.7. ✅ 总结一句话:

这段代码实现了 “鼠标按住窗体任意位置拖动,窗体跟着走” 的功能,核心是:
记录起点 → 计算偏移 → 移动窗体 → 松手停止

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/916591.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

淘宝联盟交钱建设网站手机网站qq代码

以下配置为我自己的需求&#xff0c;因人而异&#xff0c;如果只是单纯的前端非交互页面&#xff0c;可以不用修改配置。 代码及注释&#xff0c;如下&#xff1a; #解决vue-router设置mode为history&#xff0c;去掉路由地址上的/#/后nginx显示404的问题location / {proxy_htt…

厦门电脑网站建设张家界做网站的

随着社会经济的发展和数字技术的进步&#xff0c;互联网行业发展迅速。为了适应新时代社会发展的需要&#xff0c;大数据在这个社会经济发展过程中随着技术的进步而显得尤为重要。同时&#xff0c;大数据技术的快速发展进程也推动了可视化技术的飞速发展&#xff0c;国内外各类…

夺宝网站建设深圳网站导航

1、安装ntpdate&#xff0c;同步标准时间 2、修改时区 3、在.profile文件中写入上面提示的信息&#xff0c;保存退出、更新配置文件或者重启生效 3.1、或者配合上面的cp那条命令&#xff0c;用下面的命令保存到底层 $ hwclock --systohc 4、重启之后&#xff0c;查看日期时间已…

免费网站免费进入在线蓬莱网站建设价格

[react] 在react中页面重新加载时怎样保留数据&#xff1f; 使用浏览器localstorage来保存应用程序的状态 个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

net做公司网站网站建设所需要软件

GItlab概述 GitLab概述&#xff1a; 是一个利用 Ruby on Rails 开发的开源应用程序&#xff0c;实现一个自托管的Git项目仓库&#xff0c;可通过Web界面进行访问公开的或者私人项目。 Ruby on Rails 是一个可以使你开发、部署、维护 web 应用程序变得简单的框架。 GitLab拥有与…

网站的注册上一步下一步怎么做西昌市做网站的公司

文章目录 0. 引言1. 回顾2. PrioritizeNodes3. 有哪些优选算法4. selectHost5. 总结6. 参考 0. 引言 欢迎关注本专栏&#xff0c;本专栏主要从 K8s 源码出发&#xff0c;深入理解 K8s 一些组件底层的代码逻辑&#xff0c;同时借助 debug Minikube 来进一步了解 K8s 底层的代码…

建立网站赚钱 优帮云网站开发主要做什么

pytest&#xff1a; 需要安装pytest和pytest-html(生成html测试报告&#xff09; pip install pytest 和 pip install pytest-html 命名规则 Pytest单元测试中的类名和方法名必须是以test开头,执行中只能找到test开头的类和方法&#xff0c;比unittest更加严谨 unittest&#x…

邢台手机网站建设报价苏州网站营销公司简介

文章目录 前言一、思维导图危机一危机二危机三危机四危机五危机六危机七危机八 前言 重塑三观&#xff0c;致敬温老。一个有良心的学者&#xff01;&#xff01;&#xff01; 一、思维导图 危机一 危机二 危机三 危机四 危机五 危机六 危机七 危机八 ☆

买源码的网站wordpress提示框插件

随着人工智能和图像处理技术的不断发展&#xff0c;人像处理已成为企业宣传、产品展示、线上教育等领域不可或缺的一环。然而&#xff0c;面对复杂多变的人像背景&#xff0c;如何实现精准、高效的分割&#xff0c;一直是困扰企业的技术难题。为此&#xff0c;美摄科技凭借其领…

信息化建设 公司网站揭阳企业网站建设开发

智慧工地管理系统源码&#xff0c;智慧工地云平台源码&#xff0c;PC端APP端源码 智慧工地管理平台实现对人员劳务实名制管理、施工进度、安全管理、设备管理、区域安防监控系统、智能AI识别系统、用电/水监控系统、噪音扬尘监测、现场物料管理系统等方面的实时监控和管理&…

大良陈村网站建设北京推广平台

开数组 读入数据 记录最小值和最大值 每次读入x; 让a[x]; 从最小值开始 向上扫 当扫到a[x]0时候为断号 扫到a[x]>1为重号&#xff1b; 该题的小技巧 未知长度的数据的读入方式 1.首先在头文件敲上 #include<sstream> #include<string> #include<…

给宝宝做衣服网站好网站服务器结构图

1、目的 确保大模型的行为与人类价值观、人类真实意图和社会伦理相一致 2、大模型有害行为 无法正确遵循指令生成虚假信息产生有害、有误导性、有偏见的表达 3、评估标准 有用性诚实性无害性 4、更细化的对齐标准 行为对齐&#xff1a;要求AI能够做出符合人类期望的行为…

网站建设中404什么意思长治网站建设公司

在连接本地mysql数据库一直都是客户端保存密码&#xff0c;然后一键登录。突然开发要用到这个数据库时&#xff0c;脑子嗡嗡的了……忘记了密码&#xff0c;试了很多遍还是记不起来。没办法只能去找方案了&#xff0c;网上还是有很多跟我一样的大佬的。这里记录下&#xff0c;省…

做购物网站之前做些什么wordpress提速插件

程序员不管是在学习&#xff0c;还是工作过程中&#xff0c;很多时候都需要画图&#xff0c;如产品分析、架构设计、方案选型等&#xff0c;良好的绘图不仅可以让绘图者的思路清晰&#xff0c;也可以让聆听者更好的理解。用好画图&#xff0c;升职加薪少不了&#xff01;今天介…

网站上的办公网站怎么做宠物网站推广怎么做

需要云服务器等云产品来学习Linux的同学可以移步/–>腾讯云<–/官网&#xff0c;轻量型云服务器低至112元/年&#xff0c;优惠多多。&#xff08;联系我有折扣哦&#xff09; 文章目录 1. 了解磁盘1.1 磁盘的物理结构1.2 磁盘的逻辑结构1.3 磁盘的存储结构 2. 文件系统2.…

创意灵感网站中国新闻社领导名单

非极大值抑制(Non-Maximum Suppression&#xff0c;NMS)&#xff0c;顾名思义就是抑制不是极大值的元素&#xff0c;可以理解为局部最大搜索。这个局部代表的是一个邻域&#xff0c;邻域有两个参数可变&#xff0c;一是邻域的维数&#xff0c;二是邻域的大小。而是用于目标检测…

网站管理系统 免费做阿里渠道的销售要有哪些网站

发作性睡病是一种慢性的睡眠障碍&#xff0c;患者在白天会出现无法控制的睡意&#xff0c;甚至可能突然入睡。虽然饮食不能直接治愈发作性睡病&#xff0c;但合理的饮食调整可以在一定程度上缓解症状&#xff0c;提高患者的生活质量。 首先&#xff0c;发作性睡病患者需要保持…

电子产品在哪些网站做调研北京住房和城乡建设局门户网站

VQE 上行VQE&#xff0c;主要针对MIC采集部分的音频增强 下行VQE&#xff0c;主要针对SPK播放部分的音频增强 附关键词解释 RES RES 模块为重采样&#xff08;Resampler&#xff09;模块。当AI上行或AO下行通路中开启VQE 各功能 模块时&#xff0c;在处理前后各存在一次重采样…

网站开发工具的功能新沂网站制作

java是单继承的&#xff0c;java中的类不支持多继承&#xff0c;但是支持多层继承。 反证法&#xff1a; 如果一个类同时继承两个类&#xff0c;然后两个类中都有同样的一个方法&#xff0c;哪当我创建这个类里的方法&#xff0c;是调用哪父类的方法 所以java中的类不支持多继…

用.net做网站怎么修改公司网站图片

Python中的字典&#xff08;dict&#xff09;和集合&#xff08;set&#xff09;是两个强大且常用的数据结构&#xff0c;它们在处理数据和解决问题时发挥着重要作用。深入了解这两种数据结构的底层实现和用法将有助于编写更高效、灵活和可读性强的代码。 Python字典&#xff…