无边框窗体的拖动

  
这里介绍两种方法和一种特殊情况下的方法,以及本人在以前做这个小功能时候遇到的问题!

  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();

        }
    }
}




     

无边框窗体的拖动

上一篇:Photoshop 照片加上时尚个性的相框


下一篇:AI教程 绘制绚烂多彩的立体小星星