C#中如何实现用鼠标在指定控件上方移动时移动控件所在的窗体

如果要实现窗体中的某一个控件在窗体中的移动,我们会自然的会想到控件的location属性,因为基本上每一个控件都有一个location属性,但是,实际操作之后我们会发现,这样实现的移动容易会出现"闪屏"的现象.
换个角度去想想,我们改变控件的位置实际上也就是改变控件距离父容器左边和顶部的距离大小(改变坐标也是只是为了达到这个目的).在C# WinForm中认为每一个控件都必定有一个父容器,由此我们可以很肯定的说每一个控件都一定有left,right属性.所以我们可以直接的去改变要移动控件的left和right属性来达到控件移动的目的.
例如:我们想要移动的控件是一个无边框的窗体,那么我们可以把我们要移动的窗体的父容器是我们的桌面,直接的改变窗体距离桌面左边和顶部的距离即可.具体实现代码:
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;
        //鼠标移动事件 
        /// <summary>
        /// 手动去掉窗体边框
        /// </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;//移动相关准备完成,指示可以移动
            }
        }  
        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();
        }
    }
}

到此,我们就实现了一个无边框窗体的移动. 
 
 
posted @ 2013-09-14 18:58  我是张朋  阅读(2931)  评论(0编辑  收藏  举报