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自助建站平台?