栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > .Net

按住窗体任意控件拖动窗体,含详细说明

.Net 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

按住窗体任意控件拖动窗体,含详细说明

先说一下实现原理。以下图一个文件夹为例,蓝点是按住了某个控件时的鼠标位置,开始的时候先计算这个鼠标坐标与文件夹(窗体)的偏移量,就是文件夹(窗体)的坐标X-鼠标坐标X和文件夹(窗体)的坐标Y-鼠标坐标Y。

当鼠标移动到目标点(可以时下图中的红点或者绿点)将文件夹(窗体)的坐标设置为以松开鼠标的坐标加上上面获取的偏移量即可。

下面直接上代码,控件为DataGridView

        /// 
        /// 是否按下鼠标
        /// 
        bool isMouseDown = false;
        /// 
        /// 按下鼠标时,Form与按下鼠标坐标的偏移量
        /// 
        Point mouseOffset;
        private void dataGridView1_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                Control control = sender as Control;
                // 通过PointToScreen获取当前点击点的相对于屏幕的坐标(因为窗体的坐标按屏幕坐标)
                mouseOffset = control.PointToScreen(e.Location);
                // 下面计算的结果就是鼠标按下的坐标和窗体坐标的偏移量
                mouseOffset.X = this.Location.X - mouseOffset.X;
                mouseOffset.Y = this.Location.Y - mouseOffset.Y;
                // 标记已按住了鼠标
                isMouseDown = true;
            }
        }

        private void dataGridView1_MouseMove(object sender, MouseEventArgs e)
        {
            if (isMouseDown)
            {
                Control control = sender as Control;
                // 获取移动后的鼠标相对屏幕的坐标
                Point now_mouse_point = control.PointToScreen(e.Location);
                // 因为不管鼠标在什么位置,窗体的左上角坐标跟鼠标的坐标的偏移量永远是一样的
                now_mouse_point.Offset(mouseOffset.X, mouseOffset.Y);
                this.Location = now_mouse_point;
            }
        }

        private void dataGridView1_MouseUp(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                isMouseDown = false;
            }
        }

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/955654.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号