⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 formmove.cs

📁 C#窗体停靠控件类似于QQ窗体停靠,鼠标移动开时窗体就会自动停靠.
💻 CS
字号:
using System;
using System.Collections.Generic;
using System.Text;
using System.ComponentModel;
using System.Threading;
using System.Windows.Forms;
using System.Drawing;
namespace MoveForm
{
    public partial class FormMove : Component 
    {
        private Form form;
        private Thread thread;
        public Form Form 
        {
            get 
            {
                return this.form;
            }

            set 
            {
                Thread thread = new Thread(new ThreadStart(Formmove));
                thread.Start();
                this.form = value;
            }
        }

        public FormMove() {}

        internal AnchorStyles dockside = AnchorStyles.None;
        private bool IsOrg = false;
        private Rectangle lastBoard;
        private const int Docking = 0;
        private const int Pre_docking = 1;
        private const int OFF = 2;
        private int status = 2;

        private void Formmove() 
        {
            while (true)
            {
                if (this.form != null)
                {
                    InitializeComponent();
                    break;
                }
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            Control.CheckForIllegalCrossThreadCalls = false;
            thread = new Thread(new ThreadStart(dong));
            thread.Start();
        }

        private void getdockside()
        {
            if (this.form.Top <= 0)
            {
                dockside = AnchorStyles.Top;
                if (this.form.Bounds.Contains(Cursor.Position))
                    status = Pre_docking;
                else
                    status = Docking;
            }
            else if (this.form.Left <= 0)
            {
                dockside = AnchorStyles.Left;
                if (this.form.Bounds.Contains(Cursor.Position))
                    status = Pre_docking;
                else
                    status = Docking;
            }
            else if (this.form.Left >= Screen.PrimaryScreen.Bounds.Width - this.form.Width)
            {
                dockside = AnchorStyles.Right;
                if (this.form.Bounds.Contains(Cursor.Position))
                    status = Pre_docking;
                else
                    status = Docking;
            }
            else
            {
                dockside = AnchorStyles.None;
                status = OFF;
            }
        }

        public void dong()
        {
            while (true)
            {
                if(this.form != null)
                if (this == null || IsOrg == false)
                {
                    return;
                }

                if (this.form.WindowState != FormWindowState.Minimized)  //以保証最小化時,能回復到原先的狀態
                {
                    if (this.form.Bounds.Contains(Cursor.Position))
                    {
                        switch (dockside)
                        {
                            case AnchorStyles.Top:
                                if (status == Docking)
                                    this.form.Location = new Point(this.form.Location.X, 0);
                                break;
                            case AnchorStyles.Right:
                                if (status == Docking)
                                    this.form.Location = new Point(Screen.PrimaryScreen.Bounds.Width - this.form.Width, 1);
                                if (this.form.Left < Screen.PrimaryScreen.Bounds.Width - this.form.Width)
                                {
                                    if (IsOrg == true && status == OFF)
                                    {
                                        if (this.form.Bounds.Width != lastBoard.Width || this.form.Bounds.Height != lastBoard.Height)
                                        {
                                            this.form.Size = new Size(lastBoard.Width, lastBoard.Height);
                                        }
                                    }
                                }
                                break;
                            case AnchorStyles.Left:
                                if (status == Docking)
                                    this.form.Location = new Point(0, 1);
                                break;
                        }
                    }
                    else
                    {
                        switch (dockside)
                        {
                            case AnchorStyles.Top:
                                this.form.Location = new Point(this.form.Location.X, (this.form.Height - 4) * (-1));
                                break;
                            case AnchorStyles.Right:
                                this.form.Size = new Size(this.form.Width, Screen.PrimaryScreen.WorkingArea.Height);
                                this.form.Location = new Point(Screen.PrimaryScreen.Bounds.Width - 4, 1);
                                break;
                            case AnchorStyles.Left:
                                this.form.Size = new Size(this.form.Width, Screen.PrimaryScreen.WorkingArea.Height);
                                this.form.Location = new Point((-1) * (this.form.Width - 4), 1);
                                break;
                            case AnchorStyles.None:
                                if (IsOrg == true && status == OFF)
                                {
                                    if (this.form.Bounds.Width != lastBoard.Width || this.form.Bounds.Height != lastBoard.Height)
                                    {
                                        this.form.Size = new Size(lastBoard.Width, lastBoard.Height);
                                    }
                                }
                                break;
                        }
                    }

                }
            }
        }
        private void form_LocationChanged(object sender, EventArgs e)
        {
            getdockside();
            if (IsOrg == false)
            {
                lastBoard = this.form.Bounds;
                IsOrg = true;
            }
        }

        private void form_SizeChanged(object sender, EventArgs e)
        {
            if (IsOrg == true && status == OFF)
            {
                lastBoard = this.form.Bounds;
            }
        }
        
        private void form_FormClosed(object sender, FormClosedEventArgs e)
        {
            thread.Abort();
        }
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -