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 】
相关推荐:
Laravel模型事件有哪些_Laravel Model Event生命周期详解
laravel怎么通过契约(Contracts)编程_laravel契约(Contracts)编程方法
Laravel如何设置自定义的日志文件名_Laravel根据日期或用户ID生成动态日志【技巧】
Laravel如何实现多表关联模型定义_Laravel多对多关系及中间表数据存取【方法】
如何在云指建站中生成FTP站点?
HTML5段落标签p和br怎么选_文本排版常用标签对比【解答】
BootStrap整体框架之基础布局组件
非常酷的网站设计制作软件,酷培ai教育官方网站?
深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?
javascript中的数组方法有哪些_如何利用数组方法简化数据处理
Linux系统命令中tree命令详解
Python函数文档自动校验_规范解析【教程】
Android利用动画实现背景逐渐变暗
Laravel如何使用Service Provider服务提供者_Laravel依赖注入与容器绑定【深度】
如何挑选优质建站一级代理提升网站排名?
Laravel项目结构怎么组织_大型Laravel应用的最佳目录结构实践
如何在万网自助建站平台快速创建网站?
高端网站建设与定制开发一站式解决方案 中企动力
深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?
Laravel怎么实现模型属性的自动加密
Laravel队列任务超时怎么办_Laravel Queue Timeout设置详解
网站图片在线制作软件,怎么在图片上做链接?
Laravel如何使用Telescope进行调试?(安装和使用教程)
Laravel如何处理JSON字段的查询和更新_Laravel JSON列操作与查询技巧
Laravel如何实现API速率限制?(Rate Limiting教程)
Laravel怎么进行浏览器测试_Laravel Dusk自动化浏览器测试入门
Laravel怎么实现微信登录_Laravel Socialite第三方登录集成
如何正确下载安装西数主机建站助手?
Win11怎么开启自动HDR画质_Windows11显示设置HDR选项
JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)
郑州企业网站制作公司,郑州招聘网站有哪些?
香港服务器部署网站为何提示未备案?
如何快速打造个性化非模板自助建站?
香港服务器租用费用高吗?如何避免常见误区?
Laravel如何连接多个数据库_Laravel多数据库连接配置与切换教程
购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?
如何构建满足综合性能需求的优质建站方案?
Laravel Asset编译怎么配置_Laravel Vite前端构建工具使用
Laravel怎么实现搜索功能_Laravel使用Eloquent实现模糊查询与多条件搜索【实例】
如何在IIS7中新建站点?详细步骤解析
Laravel如何与Pusher实现实时通信?(WebSocket示例)
浅谈redis在项目中的应用
Win11怎么恢复误删照片_Win11数据恢复工具使用【推荐】
Laravel怎么连接多个数据库_Laravel多数据库连接配置
如何快速搭建高效香港服务器网站?
今日头条微视频如何找选题 今日头条微视频找选题技巧【指南】
昵图网官方站入口 昵图网素材图库官网入口
使用PHP下载CSS文件中的所有图片【几行代码即可实现】
Python正则表达式进阶教程_复杂匹配与分组替换解析
如何快速登录WAP自助建站平台?

