当前位置: 首页 > news >正文

C# 通过拖控件移动窗体

目录

  • 引言
  • 一、通过控件事件移动窗体
    • 1、创建窗体界面
    • 2、添加控件事件
    • 3、添加代码
  • 二、通过windowsAPI移动窗体
    • 1、 构建窗体和添加事件
    • 2、代码展示

引言

在C#Form窗体设计中,如果我们不需要使用默认边框设计自己个性化的窗体(FromBorderStyle=none时),这时候你会发现拖动窗体的功能就没有了,这里需要自己构建方法让用户可以拖动整个窗体,这里我们使用前辈的方法实现和描述一下。即可以通过窗体中的控件事件来控制拖动整个窗体,也可以通过系统API 捕获鼠标拖动窗体,下面就介绍这两方法。

一、通过控件事件移动窗体

1、创建窗体界面

在项目中添加窗体,我这里添加一个窗体test1,并添加一个label作为操作目标,添加上自己的文字,颜色突显一下。
在这里插入图片描述

2、添加控件事件

通过属性栏中的事件添加三个事件,分别是鼠标的MouseDown、MouseMove以及MouseUp事件。
在这里插入图片描述

3、添加代码

在窗体代码中添加代码,详见下面代码和注释。

        //鼠标是否拖动标志private bool isDragging = false;//鼠标按下时的位置private Point downPosition;//鼠标按下时的窗体位置private Point lastFormPosition;/// <summary>/// 鼠标按下事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void label_MouseDown(object sender, MouseEventArgs e){//判断是否为鼠标左键按下if (e.Button == MouseButtons.Left){//置标志为trueisDragging = true;//保存当前鼠标坐标downPosition = Cursor.Position;//保存当前窗体坐标lastFormPosition = this.Location;}}/// <summary>///  鼠标移动事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void label_MouseMove(object sender, MouseEventArgs e){//判断鼠标左键是否按下if (isDragging){// 计算鼠标移动的偏移量int moveX = Cursor.Position.X - downPosition.X;int moveY = Cursor.Position.Y - downPosition.Y;// 更新窗体的位置this.Location = new Point(lastFormPosition.X + moveX, lastFormPosition.Y + moveY);} }/// <summary>/// 鼠标松开事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void label_MouseUp(object sender, MouseEventArgs e){//如果是鼠标左键松开,则修改标志为falseif (e.Button == MouseButtons.Left){isDragging = false;}}

二、通过windowsAPI移动窗体

1、 构建窗体和添加事件

构建窗体和添加事件同上一个个方法,我就不详细说明了,只是添加事件的主题更换成窗体test1。

2、代码展示

构建窗体和添加事件通过鼠标移动事件中,调用windows系统API的SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam)函数,可以看到除控件外的部分都可以用来拖动整个窗体。

   private const int HT_CAPTION = 0x2;//窗体标题private const int WM_NCLBUTTONDOWN = 0xA1;//鼠标点击的是非客户区[DllImport("user32.dll")]public static extern bool ReleaseCapture();[DllImport("user32.dll")]public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);/// <summary>/// 窗体鼠标移动事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void test1_MouseMove(object sender, MouseEventArgs e){if (e.Button == MouseButtons.Left){//释放鼠标捕获ReleaseCapture();//非客户区鼠标的拖动窗体消息SendMessage(Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0);} }

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 传统CV算法——基于Opencv的图像绘制
  • ARM编程模型、指令集、ARM汇编语言程序设计
  • Mthrift服务调度
  • Robotframework框架基础
  • 自然语言处理系列五十三》文本聚类算法》文本聚类介绍及相关算法
  • 江协科技STM32学习- P11 中断系统,EXTI外部中断
  • DNS解析与网络通信中的套接字与协议栈工作机制详解
  • 概率学 笔记一 - 概率 - 随机变量 - 期望 - 方差 - 标准差(也不知道会不会有二)
  • Maven使用指南的笔记
  • Class3——Esp32|Thonny——网络连接主机-wifi连接(源代码带教程)
  • 《深度学习》OpenCV轮廓检测 轮廓近似 解析及实现
  • 代码随想录:377. 组合总和 Ⅳ
  • Nginx核心配置文件结构
  • 树莓派3B点灯(2)
  • 翻译器大分享,这5款你选哪款?
  • php的引用
  • 【Linux系统编程】快速查找errno错误码信息
  • Java教程_软件开发基础
  • java中的hashCode
  • MYSQL 的 IF 函数
  • Python - 闭包Closure
  • Work@Alibaba 阿里巴巴的企业应用构建之路
  • 爱情 北京女病人
  • 从输入URL到页面加载发生了什么
  • 官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?
  • 每天10道Java面试题,跟我走,offer有!
  • 如何实现 font-size 的响应式
  • 手机app有了短信验证码还有没必要有图片验证码?
  • 思否第一天
  • 一些css基础学习笔记
  • Spring Batch JSON 支持
  • ​iOS安全加固方法及实现
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • ​软考-高级-信息系统项目管理师教程 第四版【第14章-项目沟通管理-思维导图】​
  • #162 (Div. 2)
  • #NOIP 2014#day.2 T1 无限网络发射器选址
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (9)YOLO-Pose:使用对象关键点相似性损失增强多人姿态估计的增强版YOLO
  • (9)目标检测_SSD的原理
  • (附源码)spring boot基于小程序酒店疫情系统 毕业设计 091931
  • (已解决)vue+element-ui实现个人中心,仿照原神
  • (原创)攻击方式学习之(4) - 拒绝服务(DOS/DDOS/DRDOS)
  • (转)LINQ之路
  • (转)原始图像数据和PDF中的图像数据
  • .NET C#版本和.NET版本以及VS版本的对应关系
  • .net core 使用js,.net core 使用javascript,在.net core项目中怎么使用javascript
  • .NET Core中的去虚
  • .net dataexcel winform控件 更新 日志
  • .NET 药厂业务系统 CPU爆高分析
  • .Net(C#)自定义WinForm控件之小结篇
  • .ui文件相关
  • /etc/X11/xorg.conf 文件被误改后进不了图形化界面
  • @kafkalistener消费不到消息_消息队列对战之RabbitMq 大战 kafka
  • @RequestMapping-占位符映射
  • @value 静态变量_Python彻底搞懂:变量、对象、赋值、引用、拷贝