C# 通过拖控件移动窗体

2024-09-08 03:36

本文主要是介绍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);} }

这篇关于C# 通过拖控件移动窗体的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1146999

相关文章

C#中lock关键字的使用小结

《C#中lock关键字的使用小结》在C#中,lock关键字用于确保当一个线程位于给定实例的代码块中时,其他线程无法访问同一实例的该代码块,下面就来介绍一下lock关键字的使用... 目录使用方式工作原理注意事项示例代码为什么不能lock值类型在C#中,lock关键字用于确保当一个线程位于给定实例的代码块中时

C# $字符串插值的使用

《C#$字符串插值的使用》本文介绍了C#中的字符串插值功能,详细介绍了使用$符号的实现方式,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录$ 字符使用方式创建内插字符串包含不同的数据类型控制内插表达式的格式控制内插表达式的对齐方式内插表达式中使用转义序列内插表达式中使用

C#中的Converter的具体应用

《C#中的Converter的具体应用》C#中的Converter提供了一种灵活的类型转换机制,本文详细介绍了Converter的基本概念、使用场景,具有一定的参考价值,感兴趣的可以了解一下... 目录Converter的基本概念1. Converter委托2. 使用场景布尔型转换示例示例1:简单的字符串到

C#监听txt文档获取新数据方式

《C#监听txt文档获取新数据方式》文章介绍通过监听txt文件获取最新数据,并实现开机自启动、禁用窗口关闭按钮、阻止Ctrl+C中断及防止程序退出等功能,代码整合于主函数中,供参考学习... 目录前言一、监听txt文档增加数据二、其他功能1. 设置开机自启动2. 禁止控制台窗口关闭按钮3. 阻止Ctrl +

C#解析JSON数据全攻略指南

《C#解析JSON数据全攻略指南》这篇文章主要为大家详细介绍了使用C#解析JSON数据全攻略指南,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、为什么jsON是C#开发必修课?二、四步搞定网络JSON数据1. 获取数据 - HttpClient最佳实践2. 动态解析 - 快速

C#连接SQL server数据库命令的基本步骤

《C#连接SQLserver数据库命令的基本步骤》文章讲解了连接SQLServer数据库的步骤,包括引入命名空间、构建连接字符串、使用SqlConnection和SqlCommand执行SQL操作,... 目录建议配合使用:如何下载和安装SQL server数据库-CSDN博客1. 引入必要的命名空间2.

C#读写文本文件的多种方式详解

《C#读写文本文件的多种方式详解》这篇文章主要为大家详细介绍了C#中各种常用的文件读写方式,包括文本文件,二进制文件、CSV文件、JSON文件等,有需要的小伙伴可以参考一下... 目录一、文本文件读写1. 使用 File 类的静态方法2. 使用 StreamReader 和 StreamWriter二、二进

C#中Guid类使用小结

《C#中Guid类使用小结》本文主要介绍了C#中Guid类用于生成和操作128位的唯一标识符,用于数据库主键及分布式系统,支持通过NewGuid、Parse等方法生成,感兴趣的可以了解一下... 目录前言一、什么是 Guid二、生成 Guid1. 使用 Guid.NewGuid() 方法2. 从字符串创建

C# 比较两个list 之间元素差异的常用方法

《C#比较两个list之间元素差异的常用方法》:本文主要介绍C#比较两个list之间元素差异,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. 使用Except方法2. 使用Except的逆操作3. 使用LINQ的Join,GroupJoin

HTML5实现的移动端购物车自动结算功能示例代码

《HTML5实现的移动端购物车自动结算功能示例代码》本文介绍HTML5实现移动端购物车自动结算,通过WebStorage、事件监听、DOM操作等技术,确保实时更新与数据同步,优化性能及无障碍性,提升用... 目录1. 移动端购物车自动结算概述2. 数据存储与状态保存机制2.1 浏览器端的数据存储方式2.1.