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(门面)到底是什么原理