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

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)
            {
                //置标志为true
                isDragging = 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)
        {
            //如果是鼠标左键松开,则修改标志为false
            if (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);
       } 
   }


http://www.kler.cn/a/294335.html

相关文章:

  • 树莓派(Raspberry Pi)Pico 2 C_C++开发环境配置(Docker+SDK)
  • Windows C++ TCP/IP 两台电脑上互相传输字符串数据
  • 简单叙述 Spring Boot 启动过程
  • Linux基础1
  • HarmonyOS的@State装饰器的底层实现
  • HTTP常见的请求头有哪些?都有什么作用?在 Web 应用中使用这些请求头?
  • MySQL · 性能优化 · 提高查询效率的实用指南(上)
  • 第十四节:学习Springboot 的restful接口风格(自学Spring boot 3.x的第三天)
  • ROADM(可)-介绍
  • 【Linux网络编程】协议|OSI模型|TCP/IP模型|局域网通信|跨网络通信|地址管理|流程图
  • Kafka和ES加密
  • 深度学习dataset等概念
  • 【杂谈】-国产单片机学习成本高的原因分析
  • Deep Ocr
  • Flask如何处理静态文件
  • Spring拦截器与Servlet过滤器区别
  • Unity3D DOTS Component详解
  • 人机交互中的当斯定律
  • Redis数据持久化方法
  • 要在nginx中配置后端三个服务器的轮询和加权
  • Linux下安装和使用SVN及常用操作命令详解
  • 玩转Python Turtle库,实现满屏飘字的魔法!
  • vite项目配置本地开发使用https访问
  • 后背筋膜炎怎么治疗才能除根
  • 【数据结构】你知道什么是二叉树的顺序存储结构吗?
  • 移动端视频编辑SDK解决方案,AI语音识别添加字幕