这里介绍两种方法和一种特殊情况下的方法,以及本人在以前做这个小功能时候遇到的问题!
Now!Let‘s go!
主要思路:
第一:利用标签(或其他控件),左击该控件,然后拖动鼠标,然后窗体随之移动而移动;
第二:定义两个窗体级别的变量bool和Point类型的;分被用来判断窗体是否在被拖动状态和按下鼠标时候
的鼠标相对于窗体的位置(或鼠标相对于屏幕的位置)
第三:为该控件添加MouseDown、MouseUp、MouseMove事件,MouseDown事件给bool和Point赋值,MouseUp 给bool赋值false,MouseMove移动窗体
具体实现:
1.得到绝对位置
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace 可移动的无边界窗口 { public partial class Form3 : Form { public Form3() { InitializeComponent(); } private bool drg = false;//用于判断窗体是否处于被拖动状态 private Point clickPostin = new Point();//装载鼠标点击时候鼠标想对于窗体(而不是窗体的工作区)的位置 private void label1_MouseDown(object sender, MouseEventArgs e) { clickPostin = System.Windows.Forms.Control.MousePosition;//得到窗体相对于屏幕的坐标 clickPostin.Offset(-this.Location.X, -this.Location.Y);//鼠标对于屏幕的坐标减去屏幕对于屏幕的坐标 drg = true;//得到鼠标对于窗体的坐标 } private void label1_MouseMove(object sender, MouseEventArgs e) { if (drg) { Point formPosition = System.Windows.Forms.Control.MousePosition;//得到现在鼠标相对于屏幕的位置 formPosition.Offset(-clickPostin.X,-clickPostin.Y);//鼠标现在对于屏幕的位置减去鼠标对于窗体的位置 this.Location = formPosition;//得到窗体的位置,然后窗体的位置赋值为新值 } } private void label1_MouseUp(object sender, MouseEventArgs e) { drg = false; } } }2.得到相对移动距离
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace 可移动的无边界窗口 { public partial class Form2 : Form { public Form2() { InitializeComponent(); } //新建两个Form级别的变量 //dragging用来判断窗体是否处于被拖动状态 //mousePosition 用来记录鼠标移动前的位置 private bool dragging=false; private System.Drawing.Point mousePosition = new System.Drawing.Point(); private void label1_MouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { dragging = true; //这是鼠标按下时候的位置,该位置是相对于屏幕的 mousePosition = System.Windows.Forms.Control.MousePosition; } else dragging = false; } private void label1_MouseMove(object sender, MouseEventArgs e) { if (dragging) { Point newPoint = System.Windows.Forms.Control.MousePosition; this.Left += newPoint.X - mousePosition.X; this.Top += newPoint.Y - mousePosition.Y; mousePosition = newPoint; } } private void label1_MouseUp(object sender, MouseEventArgs e) { dragging = false; } private void button1_Click(object sender, EventArgs e) { this.Close(); } } }
3.这是一种在窗体是无边框的下使用的方法(这事前提),其实这种方法也是得到绝对的位置,其中e的位置是相对于窗体工作区的,但是在这里没有影响,因为这是无边框的窗体,整个窗体就是一个工作区。
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace 可移动的无边界窗口 { public partial class Form1 : Form { //定义一个Form级别的变量用于判断窗口是否处于被拖动状态 private Boolean dragging = false; System.Drawing.Point pointClicked = new System.Drawing.Point(0,0); public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { this.Close(); } private void label1_MouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { dragging = true; //这是鼠标按下时候的位置,该位置是相对于窗体工作区的,即就是相对于窗体的 pointClicked = new System.Drawing.Point(e.X, e.Y); } else dragging = false; } private void label1_MouseMove(object sender, MouseEventArgs e) { ///这里因为是无边框的窗体尽管e的位置是相对于工作区的,但是这里的e也是 ///相对于窗体的,因为这里没有控制区,整个窗体就是一个工作区,工作区就是窗体! if (dragging) { //创建一个point System.Drawing.Point pointMoveTo; //把鼠标当前相对于窗体的位置装换为相对于屏幕的位置 pointMoveTo = this.PointToScreen(new Point(e.X, e.Y)); //鼠标移动后的位置减去鼠标移动前相对于窗体的位置,就得到窗体在屏幕的位置 pointMoveTo.Offset(-pointClicked.X, -pointClicked.Y); //移动窗体 this.Location = pointMoveTo; } } private void label1_MouseUp(object sender, MouseEventArgs e) { dragging = false; } private void button2_Click(object sender, EventArgs e) { this.Hide(); Form2 f2 = new Form2(); f2.ShowDialog(); f2.Dispose(); this.Show(); } private void button3_Click(object sender, EventArgs e) { this.Hide(); Form3 f3 = new Form3(); f3.ShowDialog(); //f3.Dispose(); this.Show(); } } }