如果要实现窗体中的某一个控件在窗体中的移动,我们会自然的会想到控件的location属性,因为基本上每一个控件都有一个location属性,但是,实际操作之后我们会发现,这样实现的移动容易会出现"闪屏"的现象.
例如:我们想要移动的控件是一个无边框的窗体,那么我们可以把我们要移动的窗体的父容器是我们的桌面,直接的改变窗体距离桌面左边和顶部的距离即可.具体实现代码:
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 demo
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
/// <summary>
/// 是否可以准备好移动控件
/// </summary>
bool IsCanMove = false;
/// <summary>
/// 控件上被当前鼠标点下的那一点的横坐标
/// </summary>
int marking_x;
/// <summary>
/// 控件上被当前鼠标点下的那一点的纵坐标
/// </summary>
int marking_y;
//鼠标移动事件
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
/// <summary>
/// 是否可以准备好移动控件
/// </summary>
bool IsCanMove = false;
/// <summary>
/// 控件上被当前鼠标点下的那一点的横坐标
/// </summary>
int marking_x;
/// <summary>
/// 控件上被当前鼠标点下的那一点的纵坐标
/// </summary>
int marking_y;
//鼠标移动事件
/// <summary>
/// 手动去掉窗体边框
/// </summary>
private void Form1_Load(object sender, EventArgs e)
{
this.FormBorderStyle = FormBorderStyle.None;
}
/// 手动去掉窗体边框
/// </summary>
private void Form1_Load(object sender, EventArgs e)
{
this.FormBorderStyle = FormBorderStyle.None;
}
private void Form1_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button==MouseButtons.Left)
{
marking_x = MousePosition.X;//记录被鼠标点下那一点的横坐标
marking_y = MousePosition.Y;//记录被鼠标点下那一点的纵坐标
IsCanMove = true;//移动相关准备完成,指示可以移动
}
}
{
if (e.Button==MouseButtons.Left)
{
marking_x = MousePosition.X;//记录被鼠标点下那一点的横坐标
marking_y = MousePosition.Y;//记录被鼠标点下那一点的纵坐标
IsCanMove = true;//移动相关准备完成,指示可以移动
}
}
private void Form1_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button==MouseButtons.Left)
{
if (IsCanMove)
{
this.Left += MousePosition.X - marking_x;//要移动的控件距离父容器左边的距离加上控件上被移动哪一点的横向偏移量
this.Top += MousePosition.Y - marking_y;//要移动的控件距离父容器左边的距离加上控件上被移动哪一点的纵向偏移量
marking_x = MousePosition.X;//动态改变被鼠标点下那一点的横坐标
marking_y = MousePosition.Y;//动态改变被鼠标点下那一点的纵坐标
}
}
}
private void Form1_MouseUp(object sender, MouseEventArgs e)
{
if (e.Button==MouseButtons.Left)
{
IsCanMove = false;//停止移动
}
}
/// <summary>
/// 关闭窗体
/// </summary>
private void btnExit_Click(object sender, EventArgs e)
{
this.Close();
}
}
{
if (e.Button==MouseButtons.Left)
{
if (IsCanMove)
{
this.Left += MousePosition.X - marking_x;//要移动的控件距离父容器左边的距离加上控件上被移动哪一点的横向偏移量
this.Top += MousePosition.Y - marking_y;//要移动的控件距离父容器左边的距离加上控件上被移动哪一点的纵向偏移量
marking_x = MousePosition.X;//动态改变被鼠标点下那一点的横坐标
marking_y = MousePosition.Y;//动态改变被鼠标点下那一点的纵坐标
}
}
}
private void Form1_MouseUp(object sender, MouseEventArgs e)
{
if (e.Button==MouseButtons.Left)
{
IsCanMove = false;//停止移动
}
}
/// <summary>
/// 关闭窗体
/// </summary>
private void btnExit_Click(object sender, EventArgs e)
{
this.Close();
}
}
}
到此,我们就实现了一个无边框窗体的移动.
到此,我们就实现了一个无边框窗体的移动.
![](http://ctc.qzs.qq.com/qzone/em/e147.gif)