C# WinForm实现窗体上控件自由拖动功能示例
发布时间 - 2026-01-11 02:12:36 点击率:次本文实例讲述了C# WinForm实现窗体上控件自由拖动功能。分享给大家供大家参考,具体如下:

说明:首先在窗体上放一个PictrueBox控件,命名为pb1,拖动完整代码如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WinFormDrag
{
public partial class Form1 : Form
{
//鼠标按下坐标(control控件的相对坐标)
Point mouseDownPoint = Point.Empty;
//显示拖动效果的矩形
Rectangle rect = Rectangle.Empty;
//是否正在拖拽
bool isDrag = false;
public Form1()
{
InitializeComponent();
}
private void Form1_Paint(object sender, PaintEventArgs e)
{
if (rect != Rectangle.Empty)
{
if (isDrag)
{//画一个和Control一样大小的黑框
e.Graphics.DrawRectangle(Pens.Black, rect);
}
else
{
e.Graphics.DrawRectangle(new Pen(this.BackColor), rect);
}
}
}
/// <summary>
/// 按下鼠标时
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void pb1_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
mouseDownPoint = e.Location;
//记录控件的大小
rect = pb1.Bounds;
}
}
/// <summary>
/// 移过时
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void pb1_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
isDrag = true;
//重新设置rect的位置,跟随鼠标移动
rect.Location = getPointToForm(new Point(e.Location.X - mouseDownPoint.X, e.Location.Y - mouseDownPoint.Y));
this.Refresh();
}
}
/// <summary>
/// 释放鼠标按钮时
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void pb1_MouseUp(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
if (isDrag)
{
isDrag = false;
//移动control到放开鼠标的地方
pb1.Location = rect.Location;
this.Refresh();
}
reset();
}
}
//重置变量
private void reset()
{
mouseDownPoint = Point.Empty;
rect = Rectangle.Empty;
isDrag = false;
}
//把相对与control控件的坐标,转换成相对于窗体的坐标。
private Point getPointToForm(Point p)
{
return this.PointToClient(pb1.PointToScreen(p));
}
}
}
更多关于C#相关内容感兴趣的读者可查看本站专题:《WinForm控件用法总结》、《C#窗体操作技巧汇总》、《C#数据结构与算法教程》、《C#常见控件用法教程》、《C#面向对象程序设计入门教程》及《C#程序设计之线程使用技巧总结》
希望本文所述对大家C#程序设计有所帮助。
# C#
# WinForm
# 窗体
# 控件
# 拖动
# C#实现一键清空控件值的示例代码
# C#在Windows窗体控件实现内容拖放(DragDrop)功能
# C#实现代码移除窗体上的控件
# 鼠标
# 程序设计
# 按下
# 相关内容
# 感兴趣
# 数据结构
# 给大家
# 相对于
# 转换成
# 更多关于
# 命名为
# 所述
# 使用技巧
# 面向对象
# 画一
# 拖拽
# 操作技巧
# 讲述了
# WinFormDrag
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
详解vue.js组件化开发实践
Laravel用户密码怎么加密_Laravel Hash门面使用教程
logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?
米侠浏览器网页图片不显示怎么办 米侠图片加载修复
JavaScript如何实现倒计时_时间函数如何精确控制
如何自定义建站之星模板颜色并下载新样式?
Laravel怎么实现验证码(Captcha)功能
如何在阿里云服务器自主搭建网站?
rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted
Win11怎么关闭透明效果_Windows11辅助功能视觉效果设置
如何用y主机助手快速搭建网站?
高性价比服务器租赁——企业级配置与24小时运维服务
php 三元运算符实例详细介绍
Swift中switch语句区间和元组模式匹配
大型企业网站制作流程,做网站需要注册公司吗?
打开php文件提示内存不足_怎么调整php内存限制【解决方案】
制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?
如何获取上海专业网站定制建站电话?
高端云建站费用究竟需要多少预算?
Laravel如何实现API速率限制?(Rate Limiting教程)
Python数据仓库与ETL构建实战_Airflow调度流程详解
Laravel怎么发送邮件_Laravel Mail类SMTP配置教程
Laravel如何处理异常和错误?(Handler示例)
linux写shell需要注意的问题(必看)
如何在Ubuntu系统下快速搭建WordPress个人网站?
新三国志曹操传主线渭水交兵攻略
JavaScript模板引擎Template.js使用详解
企业网站制作这些问题要关注
制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?
如何使用 Go 正则表达式精准提取括号内首个纯字母标识符(忽略数字与嵌套)
Laravel怎么处理异常_Laravel自定义异常处理与错误页面教程
如何在搬瓦工VPS快速搭建网站?
Laravel如何使用Sanctum进行API认证?(SPA实战)
Laravel如何创建自定义中间件?(Middleware代码示例)
javascript日期怎么处理_如何格式化输出
香港服务器如何优化才能显著提升网站加载速度?
JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)
网站制作报价单模板图片,小松挖机官方网站报价?
Laravel如何实现事件和监听器?(Event & Listener实战)
香港服务器WordPress建站指南:SEO优化与高效部署策略
Win11怎么关闭专注助手 Win11关闭免打扰模式设置【操作】
如何在万网自助建站中设置域名及备案?
如何为不同团队 ID 动态生成多个非值班状态按钮
想要更高端的建设网站,这些原则一定要坚持!
Laravel API路由如何设计_Laravel构建RESTful API的路由最佳实践
悟空识字怎么关闭自动续费_悟空识字取消会员自动扣费步骤
nginx修改上传文件大小限制的方法
网站制作软件有哪些,制图软件有哪些?
Win11怎样安装网易有道词典_Win11安装词典教程【步骤】
Laravel中的Facade(门面)到底是什么原理

