using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace 窗体控件移动
{
    public partial class Form1 : Form
    {

        private bool button_mousedown;//确认鼠标左键+alt是否按下
        private Point original_point;//记录鼠标按下时原始位置
        private Point control_original_point;//记录控件的原始位置
        public Form1()
        {
            InitializeComponent();
        }

        //释放鼠标时
        private void button1_MouseUp(object sender, MouseEventArgs e)
        {
            this.button_mousedown = false;//释放
        }

        //按下鼠标移动鼠标时
        private void button1_MouseMove(object sender, MouseEventArgs e)//鼠标按下并移动时
        {
            if (button_mousedown == true)//确认鼠标左键+ctrl已按下时才发生
            {
                Point offset = new Point(Control.MousePosition.X - this.original_point.X, Control.MousePosition.Y - this.original_point.Y);//计算偏移量
                this.custombutton.Location = new Point(this.control_original_point.X + offset.X, this.control_original_point.Y + offset.Y);//改变控件的位置
            }
        }

        //按下鼠标左键时
        private void button1_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)//确认鼠标按下是不是左键
            {
                if (ModifierKeys == Keys.Control)//ctrl键是否按下
                {
                    this.original_point = Control.MousePosition;//获取鼠标在屏幕上的位置
                    this.control_original_point = this.custombutton.Location;//控件初始位置
                    this.button_mousedown = true;//确认鼠标左键+ctrl已按下
                }
            }
        }

        //控件单击事件
        private void button1_Click(object sender, EventArgs e)
        {
            if (this.button_mousedown == false)//没有拖拽时才引发click事件
            {
                OpenFileDialog ofd = new OpenFileDialog();
                if (ofd.ShowDialog() == DialogResult.OK)
                {
                    System.Diagnostics.Process.Start("explorer.exe", ofd.FileName);
                }
            }
        }

        //加载窗口时注册相关事件
        private void Form1_Load(object sender, EventArgs e)
        {
            this.custombutton.MouseDown += button1_MouseDown;
            this.custombutton.MouseMove += button1_MouseMove;
            this.custombutton.MouseUp += button1_MouseUp;
        }

    }
}

用ctrl键+鼠标左击去进行拖动窗体控件;

值得注意的是一次mousedown+一次mouseup事件会引发一次click事件,这个要另外设置一个变量(就如上面的button_mousedown )去记录,在没有拖动控件的意愿时才执行click事件

C#窗体控件拖动的更多相关文章

  1. [转载]WPF控件拖动

    这篇博文总结下WPF中的拖动,文章内容主要包括: 1.拖动窗口 2.拖动控件 Using Visual Studio 2.1thumb控件 2.2Drag.Drop(不连续,没有中间动画) 2.3拖动 ...

  2. C# winform 跨线程更改窗体控件的属性

    当winform程序中新开一个线程,是无法改变主线程中窗体控件的属性的,否则运行时会报错. 若想在其他线程中控制主线程中的窗体控件,则必须利用BeginInvoke方法. 例如:添加一个名为textb ...

  3. winform窗体控件(全)

    回顾跟补充下除了昨天那常用6个其他的winform窗体控件作用 1:Button:按钮 (1)AutoSize:如果是True的情况下,内容将会撑开:False的话会另起一行 (2)Enabled: ...

  4. (转)sl简单自定义win窗体控件

    sl简单自定义win窗体控件      相信大家接触过不少win窗体控件ChildWin子窗口就的sl自带的一个  而且网上也有很多类似的控件,而今天我和大家分享下自己制作个win窗体控件,希望对初学 ...

  5. 如何:对 Windows 窗体控件进行线程安全调用

    http://msdn.microsoft.com/zh-cn/library/ms171728(VS.90).aspx http://msdn.microsoft.com/zh-cn/library ...

  6. C# 静态函数调用窗体控件

    回调函数方法是静态函数,需要调用窗体控件,赋值或取值. 定义 public static Form1 mainFrm;   mainFrm = this; public partial class F ...

  7. [原创]C#按比例缩放窗体控件及字体

    按照比例缩放窗体控件及字体,如需等比例缩放,只需将x,y的比例设置成相同即可. 为了减小误差,建议使用原始尺寸来计算比例. private float X, Y; private bool b = f ...

  8. 用于列出选项的Windows窗体控件

    可以提供选项列表的控件有ListBox.ComboBox.CheckedListBox,如何正确的使用和选择这些控件,下面对此进行讨论.首先对这三种控件的功能分别进行说明: ListBox ListB ...

  9. ASP.NET中 WebForm 窗体控件使用及总结【转】

    原文链接:http://www.cnblogs.com/ylbtech/archive/2013/03/06/2944675.html ASP.NET中 WebForm 窗体控件使用及总结. 1.A, ...

随机推荐

  1. 开源大数据引擎:Greenplum 数据库架构分析

    Greenplum 数据库是最先进的分布式开源数据库技术,主要用来处理大规模的数据分析任务,包括数据仓库.商务智能(OLAP)和数据挖掘等.自2015年10月正式开源以来,受到国内外业内人士的广泛关注 ...

  2. 通信协议之sdp---sdp会话协议

    (1)sdp 描述格式 (2)sdp example (3) sdp (1)sdp 描述格式 m=video 1234 RTP/AVP 96a=rtpmap:96 H264a=framerate:15 ...

  3. PostgreSQL 封装操作数据库方法

    /// <summary> /// 模块名:操作postgres数据库公共类 /// 作用:根据业务需求对数据库进行操作. /// 注:系统中的公共方法,根据需要,逐一引入 /// 作者: ...

  4. String代码示例

    package lianxi; public class lianxi0112 { public static void main(String[] args) { // TODO 自动生成的方法存根 ...

  5. GS发包到MS

    GS发包到MS(GS,MS包交互过程) 例:人物上线 首先看看其实如何确定是哪张地图的 数据库首先只保存一个mapid 在share初始化的时候已经初始化了所有map,并保存了map的指针信息,其ke ...

  6. 我的Android进阶之旅------>Android如何通过自定义SeekBar来实现视频播放进度条

    首先来看一下效果图,如下所示: 其中进度条如下: 接下来说一说我的思路,上面的进度拖动条有自定义的Thumb,在Thumb正上方有一个PopupWindow窗口,窗口里面显示当前的播放时间.在Seek ...

  7. .net概念(转)

    你主要想问.Net和Java的差异在哪里 Java是开发语言 .Net叫开发平台 但事实上你管Java叫开发平台也没错 平台就是一个供你在上面进行开发的平台 (英语叫Framework,也可以翻译成“ ...

  8. 让我们再谈谈 iOS 安全

    前言 安全方面的话题总是聊不完的.这不,国外一家有名的专门攻击别人的安全公司 Hacking Team 自己被 Hack 了,结果有 400 多 G 的攻击资料泄漏出来,包括一些 0-day 的漏洞. ...

  9. SpringCloud与Dubbo区别

    为什么放弃Dubbo 使用SpringCloud? 相同点:SpringCloud 和Dubbo可以实现RPC远程调用框架,可以实现服务治理. 不同点: SpringCloud是一套目前比较网站微服务 ...

  10. css3立体旋转菜单

    css3立体旋转菜单,css3,3D,立体旋转,立体菜单,菜单导航,css3立体旋转菜单是一款纯css3实现的三维立体旋转导航菜单. 源码下载页:http://www.huiyi8.com/sc/71 ...