这里介绍两种方法和一种特殊情况下的方法,以及本人在以前做这个小功能时候遇到的问题!
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();
}
}
}
原文:http://blog.csdn.net/leiaixue/article/details/18371811