C#创建磁性窗体的方法:创建特殊窗体

news2024/11/25 19:55:29

目录

一、磁性窗体

二、磁性窗体的实现方法

(1)无标题窗体的移动

(2)Left属性

(3)Top属性

二、设计一个磁性窗体的实例

(1)资源管理器Resources.Designer.cs设计

(2)公共类Frm_Play.cs

(3)主窗体

1.Frm_Play.cs

2.Frm_Play.Designer.cs

(4)子窗体1

1.Frm_ListBox.cs

2.Frm_ListBox.Designer.cs

(5)子窗体2

1.Frm_Libretto.cs

2.Frm_Libretto.Designer.cs

(6)生成效果


一、磁性窗体

        经常会遇到一种情况,即当拖动一个窗体(主窗体)时,其他窗体(子窗体)随着该窗体移动,当拖动子窗体时,其他窗体将不跟随移动,这就是磁性窗体。

二、磁性窗体的实现方法

        在主窗体移动时,通过改变跟随窗体的Left和Top属性值实现“磁性”。

(1)无标题窗体的移动

        无标题窗体的移动主要是通过控件来移动窗体,比如,用Panel控件来进行。首先,在Panel控件的MouseDown事件中将鼠标按下时的位置值(负值)存入到全局变量CPoint中,代码如下:

private void panel_Title_MouseDown(object sender,MouseEventArgs e)
CPoint=new Point(-e.X,-e.Y);    //获取鼠标按下时的位置

        然后,在Panel控件的MouseMove事件中按照CPoint变量的值,以屏幕坐标平移指定的量,并用平移后的结果设置窗体的DesktopLocation属性,代码如下:

private void panel_Title_MouseMove(object sender,MouseEventArgs e)
if(e.Button==MouseButtons.Left)
{
    Point myPosittion=Control.MousePosition; //获取当前鼠标的屏幕坐标
    myPosittion.Offset(CPoint.X,CPoint.Y);   //以屏幕坐标平移指定的量
    DesktopLocation=myPosittion;             //设置当前窗体在屏幕上的位置

}

(2)Left属性

        该属性用于获取或设置控件左边缘与其容器的工作区左边缘之间的距离(以像素为单位)。语法格式如下:

public int Left {get;set;}
参数说明
属性值:窗体左边缘与其容器的工作区左边缘之间的距离(以像素为单位)。

(3)Top属性

        该属性用于获取或设置控件上边缘与其容器的工作区上边缘之间的距离(以像素为单位)。语法格式如下:

public int Top{get;set;}
参数说明属性值:窗体上边缘与其容器的工作区上边缘之间的距离(以像素为单位)。

二、设计一个磁性窗体的实例

        本实例将制作一个磁性窗体,当拖动主窗体移动时,两个子窗体如果相连,则跟随移动。

  • 三个窗体:主窗体Frm_Play.cs,2个子窗体:Frm_ListBox.cs、Frm_Libretto.cs;
  • 鼠标按下任一窗体顶部的控件,可以拖动窗体;
  • 拖动子窗体时,会使得粘在一起的窗体分开,拖动主窗体时会使粘在一起的子窗体随动;
  • 拖动主窗体靠近子窗体小于相互吸引的缝隙10时,松开鼠标,靠近的窗体会像磁铁一样吸引在一起;主窗体吸引子窗体后,该子窗体还可以吸引其它子窗体;
  • 双击主窗体的控件,激活所有窗体;

(1)资源管理器Resources.Designer.cs设计

        项目使用的图片资源应设计到资源管理器,详见本文作者写的其它文章:C#手动改变自制窗体的大小-CSDN博客 https://wenchm.blog.csdn.net/article/details/137027140

(2)公共类Frm_Play.cs

// 类设计
namespace _185
{
    internal class FrmClass
    {

        #region  磁性窗体-公共变量
        //记录窗体的隐藏与显示
        public static bool Frm_ListShow = false;
        public static bool Frm_LibrettoShow = false;
        public static bool Frm_ScreenShow = false;

        //记录鼠标的当前位置
        public static Point CPoint;
        public static Point FrmPoint;
        public static int Gap = 10;//设置窗体间相互吸引的缝隙尺寸

        //Frm_Play窗体的位置及大小
        public static int Frm_Play_Top = 0;
        public static int Frm_Play_Left = 0;
        public static int Frm_Play_Width = 0;
        public static int Frm_Play_Height = 0;
        public static bool Is_TwoAssitForm_AdhereTo = false;//辅助窗体是否磁性在一起

        //Frm_ListBos窗体的位置及大小
        public static int Frm_List_Top = 0;
        public static int Frm_List_Left = 0;
        public static int Frm_List_Width = 0;
        public static int Frm_List_Height = 0;
        public static bool Is_Frm_List_AdhereTo = false;//辅助窗体是否与主窗体磁性在一起

        //Frm_Libretto窗体的位置及大小
        public static int Frm_Libretto_Top = 0;
        public static int Frm_Libretto_Left = 0;
        public static int Frm_Libretto_Width = 0;
        public static int Frm_Libretto_Height = 0;
        public static bool Is_Frm_Libretto_AdhereTo = false;//辅助窗体是否与主窗体磁性在一起

        //窗体之间的距离差
        public static int Frm_List_Gap_Top = 0;
        public static int Frm_List_Gap_Left = 0;
        public static int Frm_Libretto_Gap_Top = 0;
        public static int Frm_Libretto_Gap_Left = 0;
        #endregion

        #region  检测各窗体是否连接在一起
        /// <summary>
        /// 检测各窗体是否连接在一起
        /// </summary>
        public static void Is_Addhered_Check()
        {
            //Frm_ListBos与主窗体
            bool Temp_Magnetism = false;
            if ((Frm_Play_Top - Frm_List_Top) == 0)
                Temp_Magnetism = true;
            if ((Frm_Play_Left - Frm_List_Left) == 0)
                Temp_Magnetism = true;
            if ((Frm_Play_Left - Frm_List_Left - Frm_List_Width) == 0)
                Temp_Magnetism = true;
            if ((Frm_Play_Left - Frm_List_Left + Frm_List_Width) == 0)
                Temp_Magnetism = true;
            if ((Frm_Play_Top - Frm_List_Top - Frm_List_Height) == 0)
                Temp_Magnetism = true;
            if ((Frm_Play_Top - Frm_List_Top + Frm_List_Height) == 0)
                Temp_Magnetism = true;
            if (Temp_Magnetism)
                Is_Frm_List_AdhereTo = true;

            //Frm_Libretto与主窗体
            Temp_Magnetism = false;
            if ((Frm_Play_Top - Frm_Libretto_Top) == 0)
                Temp_Magnetism = true;
            if ((Frm_Play_Left - Frm_Libretto_Left) == 0)
                Temp_Magnetism = true;
            if ((Frm_Play_Left - Frm_Libretto_Left - Frm_Libretto_Width) == 0)
                Temp_Magnetism = true;
            if ((Frm_Play_Left - Frm_Libretto_Left + Frm_Libretto_Width) == 0)
                Temp_Magnetism = true;
            if ((Frm_Play_Top - Frm_Libretto_Top - Frm_Libretto_Height) == 0)
                Temp_Magnetism = true;
            if ((Frm_Play_Top - Frm_Libretto_Top + Frm_Libretto_Height) == 0)
                Temp_Magnetism = true;
            if (Temp_Magnetism)
                Is_Frm_Libretto_AdhereTo = true;

            //两个辅窗体
            Temp_Magnetism = false;
            if ((Frm_List_Top - Frm_Libretto_Top) == 0)
                Temp_Magnetism = true;
            if ((Frm_List_Left - Frm_Libretto_Left) == 0)
                Temp_Magnetism = true;
            if ((Frm_List_Left - Frm_Libretto_Left - Frm_Libretto_Width) == 0)
                Temp_Magnetism = true;
            if ((Frm_List_Left - Frm_Libretto_Left + Frm_Libretto_Width) == 0)
                Temp_Magnetism = true;
            if ((Frm_List_Top - Frm_Libretto_Top - Frm_Libretto_Height) == 0)
                Temp_Magnetism = true;
            if ((Frm_List_Top - Frm_Libretto_Top + Frm_Libretto_Height) == 0)
                Temp_Magnetism = true;
            if (Temp_Magnetism)
                Is_TwoAssitForm_AdhereTo = true;
        }
        #endregion

        #region  利用窗体上的控件移动窗体
        /// <summary>
        /// 利用控件移动窗体
        /// </summary>
        /// <param Frm="Form">窗体</param>
        /// <param e="MouseEventArgs">控件的移动事件</param>
        public static void MoveForm(Form Frm, MouseEventArgs e) 
        {
            if (e.Button == MouseButtons.Left)
            {
                Point myPosittion = Control.MousePosition;    //获取当前鼠标的屏幕坐标
                myPosittion.Offset(CPoint.X, CPoint.Y);       //重载当前鼠标的位置
                Frm.DesktopLocation = myPosittion;            //设置当前窗体在屏幕上的位置
            }
        }
        #endregion

        #region  计算窗体之间的缝隙
        /// <summary>
        /// 计算窗体之间的距离差
        /// </summary>
        /// <param Frm="Form">窗体</param>
        /// <param Follow="Form">跟随窗体</param>
        public static void Calculate_Gap(Form Frm, Form Follow)
        {
            switch (Follow.Name)
            {
                case "Frm_ListBox":
                    {
                        Frm_List_Gap_Top = Follow.Top - Frm.Top;
                        Frm_List_Gap_Left = Follow.Left - Frm.Left;
                        break;
                    }
                case "Frm_Libretto":
                    {
                        Frm_Libretto_Gap_Top = Follow.Top - Frm.Top;
                        Frm_Libretto_Gap_Left = Follow.Left - Frm.Left;
                        break;
                    }
            }
        }
        #endregion

        #region  磁性窗体的移动
        /// <summary>
        /// 磁性窗体的移动
        /// </summary>
        /// <param Frm="Form">窗体</param>
        /// <param e="MouseEventArgs">控件的移动事件</param>
        /// <param Follow="Form">跟随窗体</param>
        public static void MoveManyForm(Form Frm, MouseEventArgs e, Form Follow)
        {
            ArgumentNullException.ThrowIfNull(Frm);

            if (e.Button == MouseButtons.Left)
            {
                int Tem_Left = 0;
                int Tem_Top = 0;
                Point myPosittion = Control.MousePosition;//获取当前鼠标的屏幕坐标
                switch (Follow.Name)
                {
                    case "Frm_ListBox":
                        {
                            Tem_Top = Frm_List_Gap_Top - FrmPoint.Y;
                            Tem_Left = Frm_List_Gap_Left - FrmPoint.X;
                            break;
                        }
                    case "Frm_Libretto":
                        {
                            Tem_Top = Frm_Libretto_Gap_Top - FrmPoint.Y;
                            Tem_Left = Frm_Libretto_Gap_Left - FrmPoint.X;
                            break;
                        }
                }
                myPosittion.Offset(Tem_Left, Tem_Top);
                Follow.DesktopLocation = myPosittion;
            }
        }
        #endregion

        #region  对窗体的位置进行初始化
        /// <summary>
        /// 对窗体的位置进行初始化
        /// </summary>
        /// <param Frm="Form">窗体</param>
        public static void FrmInitialize(Form Frm)
        {
            switch (Frm.Name)
            {
                case "Frm_Play":
                    {
                        Frm_Play_Top = Frm.Top;
                        Frm_Play_Left = Frm.Left;
                        Frm_Play_Width = Frm.Width;
                        Frm_Play_Height = Frm.Height;
                        break;
                    }
                case "Frm_ListBox":
                    {
                        Frm_List_Top = Frm.Top;
                        Frm_List_Left = Frm.Left;
                        Frm_List_Width = Frm.Width;
                        Frm_List_Height = Frm.Height;
                        break;
                    }
                case "Frm_Libretto":
                    {
                        Frm_Libretto_Top = Frm.Top;
                        Frm_Libretto_Left = Frm.Left;
                        Frm_Libretto_Width = Frm.Width;
                        Frm_Libretto_Height = Frm.Height;
                        break;
                    }
            }

        }
        #endregion

        #region  存储各窗体的当前信息
        /// <summary>
        /// 存储各窗体的当前信息
        /// </summary>
        /// <param Frm="Form">窗体</param>
        /// <param e="MouseEventArgs">控件的移动事件</param>
        public static void FrmPlace(Form Frm)
        {
            FrmInitialize(Frm);
            FrmMagnetism(Frm);
        }
        #endregion

        #region  窗体的磁性设置
        /// <summary>
        /// 窗体的磁性设置
        /// </summary>
        /// <param Frm="Form">窗体</param>
        public static void FrmMagnetism(Form Frm)
        {
            if (Frm.Name != "Frm_Play")
            {
                FrmMagnetismCount(Frm, Frm_Play_Top, Frm_Play_Left, Frm_Play_Width, Frm_Play_Height, "Frm_Play");
            }
            if (Frm.Name != "Frm_ListBos")
            {
                FrmMagnetismCount(Frm, Frm_List_Top, Frm_List_Left, Frm_List_Width, Frm_List_Height, "Frm_ListBos");
            }
            if (Frm.Name != "Frm_Libratto")
            {
                FrmMagnetismCount(Frm, Frm_Libretto_Top, Frm_Libretto_Left, Frm_Libretto_Width, Frm_Libretto_Height, "Frm_Libratto");
            }
            FrmInitialize(Frm);
        }
        #endregion

        #region  磁性窗体的计算
        /// <summary>
        /// 磁性窗体的计算
        /// </summary>
        /// <param Frm="Form">窗体</param>
        /// <param e="MouseEventArgs">控件的移动事件</param>
        public static void FrmMagnetismCount(Form Frm, int top, int left, int width, int height, string Mforms)
        {
            bool Tem_Magnetism = false;    //判断是否有磁性发生
            string Tem_MainForm = "";      //临时记录主窗体
            string Tem_AssistForm = "";    //临时记录辅窗体

            //上面进行磁性窗体
            if ((Frm.Top + Frm.Height - top) <= Gap && (Frm.Top + Frm.Height - top) >= -Gap)
            {
                //当一个主窗体不包含辅窗体时
                if ((Frm.Left >= left && Frm.Left <= (left + width)) || ((Frm.Left + Frm.Width) >= left && (Frm.Left + Frm.Width) <= (left + width)))
                {
                    Frm.Top = top - Frm.Height;
                    if ((Frm.Left - left) <= Gap && (Frm.Left - left) >= -Gap)
                        Frm.Left = left;
                    Tem_Magnetism = true;
                }
                //当一个主窗体包含辅窗体时
                if (Frm.Left <= left && (Frm.Left + Frm.Width) >= (left + width))
                {
                    Frm.Top = top - Frm.Height;
                    if ((Frm.Left - left) <= Gap && (Frm.Left - left) >= -Gap)
                        Frm.Left = left;
                    Tem_Magnetism = true;
                }
            }

            //下面进行磁性窗体
            if ((Frm.Top - (top + height)) <= Gap && (Frm.Top - (top + height)) >= -Gap)
            {
                //当一个主窗体不包含辅窗体时
                if ((Frm.Left >= left && Frm.Left <= (left + width)) || ((Frm.Left + Frm.Width) >= left && (Frm.Left + Frm.Width) <= (left + width)))
                {
                    Frm.Top = top + height;
                    if ((Frm.Left - left) <= Gap && (Frm.Left - left) >= -Gap)
                        Frm.Left = left;
                    Tem_Magnetism = true;
                }
                //当一个主窗体包含辅窗体时
                if (Frm.Left <= left && (Frm.Left + Frm.Width) >= (left + width))
                {
                    Frm.Top = top + height;
                    if ((Frm.Left - left) <= Gap && (Frm.Left - left) >= -Gap)
                        Frm.Left = left;
                    Tem_Magnetism = true;
                }
            }

            //左面进行磁性窗体
            if ((Frm.Left + Frm.Width - left) <= Gap && (Frm.Left + Frm.Width - left) >= -Gap)
            {
                //当一个主窗体不包含辅窗体时
                if ((Frm.Top > top && Frm.Top <= (top + height)) || ((Frm.Top + Frm.Height) >= top && (Frm.Top + Frm.Height) <= (top + height)))
                {
                    Frm.Left = left - Frm.Width;
                    if ((Frm.Top - top) <= Gap && (Frm.Top - top) >= -Gap)
                        Frm.Top = top;
                    Tem_Magnetism = true;
                }
                //当一个主窗体包含辅窗体时
                if (Frm.Top <= top && (Frm.Top + Frm.Height) >= (top + height))
                {
                    Frm.Left = left - Frm.Width;
                    if ((Frm.Top - top) <= Gap && (Frm.Top - top) >= -Gap)
                        Frm.Top = top;
                    Tem_Magnetism = true;
                }
            }

            //右面进行磁性窗体
            if ((Frm.Left - (left + width)) <= Gap && (Frm.Left - (left + width)) >= -Gap)
            {
                //当一个主窗体不包含辅窗体时
                if ((Frm.Top > top && Frm.Top <= (top + height)) || ((Frm.Top + Frm.Height) >= top && (Frm.Top + Frm.Height) <= (top + height)))
                {
                    Frm.Left = left + width;
                    if ((Frm.Top - top) <= Gap && (Frm.Top - top) >= -Gap)
                        Frm.Top = top;
                    Tem_Magnetism = true;
                }
                //当一个主窗体包含辅窗体时
                if (Frm.Top <= top && (Frm.Top + Frm.Height) >= (top + height))
                {
                    Frm.Left = left + width;
                    if ((Frm.Top - top) <= Gap && (Frm.Top - top) >= -Gap)
                        Frm.Top = top;
                    Tem_Magnetism = true;
                }
            }
            if (Frm.Name == "Frm_Play")
                Tem_MainForm = "Frm_Play";
            else
                Tem_AssistForm = Frm.Name;
            if (Mforms == "Frm_Play")
                Tem_MainForm = "Frm_Play";
            else
                Tem_AssistForm = Mforms;
            if (Tem_MainForm == "")
            {
                Is_TwoAssitForm_AdhereTo = Tem_Magnetism;
            }
            else
            {
                switch (Tem_AssistForm)
                {
                    case "Frm_ListBos":
                        Is_Frm_List_AdhereTo = Tem_Magnetism;
                        break;
                    case "Frm_Libratto":
                        Is_Frm_Libretto_AdhereTo = Tem_Magnetism;
                        break;
                }
            }
        }
        #endregion

        #region  恢复窗体的初始大小
        /// <summary>
        /// 恢复窗体的初始大小(当松开鼠标时,如果窗体的大小小于300*200,恢复初始状态)
        /// </summary>
        /// <param Frm="Form">窗体</param>
        public static void FrmScreen_FormerlySize(Form Frm, int PWidth, int PHeight)
        {
            if (Frm.Width < PWidth || Frm.Height < PHeight)
            {
                Frm.Width = PWidth;
                Frm.Height = PHeight;
                //Example_Size = false;
            }
        }
        #endregion

    }
}

(3)主窗体

1.Frm_Play.cs

namespace _185
{
    public partial class Frm_Play : Form
    {
        public Frm_Play()
        {
            InitializeComponent();
        }

        #region  公共变量
        FrmClass Cla_FrmClass = new();
        public static Form F_List = new();
        public static Form F_Libretto = new();
        public static Form F_Screen = new();
        #endregion

        private void Frm_Play_Load(object sender, EventArgs e)
        {
            FrmClass.FrmInitialize(this);                //窗体位置的初始化
        }

        private void Panel1_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)            //按下的是否为鼠标左键
            {
                FrmClass.Is_Addhered_Check();             //检测各窗体是否连在一起
                int Tem_Y = e.Y;
                FrmClass.FrmPoint = new Point(e.X, Tem_Y);//获取鼠标在窗体上的位置,用于磁性窗体
                FrmClass.CPoint = new Point(-e.X, -Tem_Y);//获取鼠标在屏幕上的位置,用于窗体的移动
                if (FrmClass.Is_Frm_List_AdhereTo)              //如果与frm_ListBox窗体相连接
                {
                    FrmClass.Calculate_Gap(this, F_List);        //计算窗体的距离差
                    if (FrmClass.Is_TwoAssitForm_AdhereTo)       //两个辅窗体是否连接在一起
                    {
                        FrmClass.Calculate_Gap(this, F_Libretto);//计算窗体的距离差
                    }
                }
                if (FrmClass.Is_Frm_Libretto_AdhereTo)        //如果与frm_Libretto窗体相连接
                {
                    FrmClass.Calculate_Gap(this, F_Libretto); //计算窗体的距离差
                    if (FrmClass.Is_TwoAssitForm_AdhereTo)    //两个辅窗体是否连接在一起
                    {
                        FrmClass.Calculate_Gap(this, F_List); //计算窗体的距离差
                    }
                }
            }
        }

        private void Panel1_MouseMove(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)            //按下的是否为鼠标左键
            {

                FrmClass.MoveForm(this, e);               //利用控件移动窗体
                if (FrmClass.Is_Frm_List_AdhereTo)        //如果frm_ListBox窗体与主窗体连接
                {

                    FrmClass.MoveManyForm(this, e, F_List);//磁性窗体的移动
                    FrmClass.FrmInitialize(F_List);        //对frm_ListBox窗体的位置进行初始化
                    if (FrmClass.Is_TwoAssitForm_AdhereTo) //如果两个子窗体连接在一起
                    {
                        FrmClass.MoveManyForm(this, e, F_Libretto);
                        FrmClass.FrmInitialize(F_Libretto);
                    }
                }

                if (FrmClass.Is_Frm_Libretto_AdhereTo)    //如果frm_Libretto窗体与主窗体连接
                {
                    FrmClass.MoveManyForm(this, e, F_Libretto);
                    FrmClass.FrmInitialize(F_Libretto);
                    if (FrmClass.Is_TwoAssitForm_AdhereTo)
                    {
                        FrmClass.MoveManyForm(this, e, F_List);
                        FrmClass.FrmInitialize(F_List);
                    }
                }
                FrmClass.FrmInitialize(this);
            }
        }

        private void Panel1_MouseUp(object sender, MouseEventArgs e)
        {
            FrmClass.FrmPlace(this);
        }

        private void Frm_Play_Shown(object sender, EventArgs e)
        {
            //显示列表窗体
            F_List = new Frm_ListBox
            {
                ShowInTaskbar = false
            };
            FrmClass.Frm_ListShow = true;
            F_List.Show();
            //显示歌词窗体
            F_Libretto = new Frm_Libretto
            {
                ShowInTaskbar = false,
                Left = Left + Width,
                Top = Top
            };
            FrmClass.Frm_LibrettoShow = true;
            F_Libretto.Show();
            //各窗体位置的初始化
            FrmClass.FrmInitialize(F_List);
            FrmClass.FrmInitialize(F_Libretto);
        }

        private void Panel2_Click(object sender, EventArgs e)
        {
            F_List.Close();
            F_List.Dispose();
            F_Libretto.Close();
            F_Libretto.Dispose();
            F_Screen.Close();
            F_Screen.Dispose();
            Close();
        }

        private void Panel1_Click(object sender, EventArgs e)
        {
            F_List.Focus();
            F_Libretto.Focus();
            Focus();
        }
    }
}

2.Frm_Play.Designer.cs

namespace _185
{
    partial class Frm_Play
    {
        /// <summary>
        ///  Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        ///  Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Windows Form Designer generated code

        /// <summary>
        ///  Required method for Designer support - do not modify
        ///  the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            panel1 = new Panel();
            pictureBox1 = new PictureBox();
            panel2 = new Panel();
            ((System.ComponentModel.ISupportInitialize)pictureBox1).BeginInit();
            SuspendLayout();
            // 
            // panel1
            // 
            panel1.BackgroundImage = Properties.Resources._5;
            panel1.BackgroundImageLayout = ImageLayout.Stretch;
            panel1.Dock = DockStyle.Top;
            panel1.Location = new Point(0, 0);
            panel1.Name = "panel1";
            panel1.Size = new Size(290, 31);
            panel1.TabIndex = 0;
            panel1.Click += Panel1_Click;
            panel1.MouseDown += Panel1_MouseDown;
            panel1.MouseMove += Panel1_MouseMove;
            panel1.MouseUp += Panel1_MouseUp;
            // 
            // pictureBox1
            // 
            pictureBox1.BackgroundImage = Properties.Resources._01;
            pictureBox1.BackgroundImageLayout = ImageLayout.Stretch;
            pictureBox1.Dock = DockStyle.Fill;
            pictureBox1.Location = new Point(0, 31);
            pictureBox1.Name = "pictureBox1";
            pictureBox1.Size = new Size(290, 89);
            pictureBox1.TabIndex = 1;
            pictureBox1.TabStop = false;
            // 
            // panel2
            // 
            panel2.BackgroundImage = Properties.Resources.Close;
            panel2.BackgroundImageLayout = ImageLayout.Stretch;
            panel2.Location = new Point(265, 5);
            panel2.Name = "panel2";
            panel2.Size = new Size(18, 18);
            panel2.TabIndex = 0;
            panel2.Click += Panel2_Click;
            // 
            // Frm_Play
            // 
            AutoScaleDimensions = new SizeF(7F, 17F);
            AutoScaleMode = AutoScaleMode.Font;
            ClientSize = new Size(290, 120);
            Controls.Add(panel2);
            Controls.Add(pictureBox1);
            Controls.Add(panel1);
            FormBorderStyle = FormBorderStyle.None;
            Name = "Frm_Play";
            Text = "Form1";
            Load += Frm_Play_Load;
            Shown += Frm_Play_Shown;
            ((System.ComponentModel.ISupportInitialize)pictureBox1).EndInit();
            ResumeLayout(false);
        }

        #endregion

        private Panel panel1;
        private PictureBox pictureBox1;
        private Panel panel2;
    }
}

(4)子窗体1

1.Frm_ListBox.cs

namespace _185
{
    public partial class Frm_ListBox : Form
    {
        public Frm_ListBox()
        {
            InitializeComponent();
        }

        #region  公共变量
        FrmClass Cla_FrmClass = new();
        #endregion

        private void Frm_ListBox_Load(object sender, EventArgs e)
        {
            Left = FrmClass.Frm_Play_Left;
            Top = FrmClass.Frm_Play_Top + FrmClass.Frm_Play_Height;
            FrmClass.FrmInitialize(this);
        }

        private void Panel1_MouseDown(object sender, MouseEventArgs e)
        {
            FrmClass.CPoint = new Point(-e.X, -e.Y);
        }

        private void Panel1_MouseMove(object sender, MouseEventArgs e)
        {
            FrmClass.Is_TwoAssitForm_AdhereTo = false;
            FrmClass.Is_Frm_List_AdhereTo = false;
            FrmClass.MoveForm(this, e);
        }

        private void Panel1_MouseUp(object sender, MouseEventArgs e)
        {
            FrmClass.FrmPlace(this);
        }
    }
}

2.Frm_ListBox.Designer.cs


namespace _185
{
    partial class Frm_ListBox
    {
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Windows Form Designer generated code

        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            panel1 = new Panel();
            pictureBox1 = new PictureBox();
            ((System.ComponentModel.ISupportInitialize)pictureBox1).BeginInit();
            SuspendLayout();
            // 
            // panel1
            // 
            panel1.BackgroundImage = Properties.Resources._5;
            panel1.Dock = DockStyle.Top;
            panel1.Location = new Point(0, 0);
            panel1.Name = "panel1";
            panel1.Size = new Size(290, 31);
            panel1.TabIndex = 0;
            panel1.MouseDown += Panel1_MouseDown;
            panel1.MouseMove += Panel1_MouseMove;
            panel1.MouseUp += Panel1_MouseUp;
            // 
            // pictureBox1
            // 
            pictureBox1.BackgroundImage = Properties.Resources._02;
            pictureBox1.BackgroundImageLayout = ImageLayout.Stretch;
            pictureBox1.Dock = DockStyle.Fill;
            pictureBox1.Location = new Point(0, 31);
            pictureBox1.Name = "pictureBox1";
            pictureBox1.Size = new Size(290, 89);
            pictureBox1.TabIndex = 1;
            pictureBox1.TabStop = false;
            // 
            // Frm_ListBox
            // 
            AutoScaleDimensions = new SizeF(7F, 17F);
            AutoScaleMode = AutoScaleMode.Font;
            ClientSize = new Size(290, 120);
            Controls.Add(pictureBox1);
            Controls.Add(panel1);
            FormBorderStyle = FormBorderStyle.None;
            Name = "Frm_ListBox";
            Text = "Form1";
            Load += Frm_ListBox_Load;
            ((System.ComponentModel.ISupportInitialize)pictureBox1).EndInit();
            ResumeLayout(false);
        }

        #endregion

        private Panel panel1;
        private PictureBox pictureBox1;
    }
}

(5)子窗体2

1.Frm_Libretto.cs

namespace _185
{
    public partial class Frm_Libretto : Form
    {
        public Frm_Libretto()
        {
            InitializeComponent();
        }

        #region  公共变量
        FrmClass Cla_FrmClass = new();
        #endregion

        private void Frm_Libretto_Load(object sender, EventArgs e)
        {
            Left = FrmClass.Frm_Play_Left;
            Top = FrmClass.Frm_Play_Top + FrmClass.Frm_Play_Height;
            FrmClass.FrmInitialize(this);
        }

        private void Panel1_MouseDown(object sender, MouseEventArgs e)
        {
            FrmClass.CPoint = new Point(-e.X, -e.Y);
        }

        private void Panel1_MouseMove(object sender, MouseEventArgs e)
        {
            FrmClass.Is_TwoAssitForm_AdhereTo = false;
            FrmClass.Is_Frm_List_AdhereTo = false;
            FrmClass.MoveForm(this, e);
        }

        private void Panel1_MouseUp(object sender, MouseEventArgs e)
        {
            FrmClass.FrmPlace(this);
        }
    }
}

2.Frm_Libretto.Designer.cs

namespace _185
{
    partial class Frm_Libretto
    {
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Windows Form Designer generated code

        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            panel1 = new Panel();
            pictureBox1 = new PictureBox();
            ((System.ComponentModel.ISupportInitialize)pictureBox1).BeginInit();
            SuspendLayout();
            // 
            // panel1
            // 
            panel1.BackgroundImage = Properties.Resources._5;
            panel1.BackgroundImageLayout = ImageLayout.Stretch;
            panel1.Dock = DockStyle.Top;
            panel1.Location = new Point(0, 0);
            panel1.Name = "panel1";
            panel1.Size = new Size(290, 31);
            panel1.TabIndex = 0;
            panel1.MouseDown += Panel1_MouseDown;
            panel1.MouseMove += Panel1_MouseMove;
            panel1.MouseUp += Panel1_MouseUp;
            // 
            // pictureBox1
            // 
            pictureBox1.BackgroundImage = Properties.Resources._03;
            pictureBox1.BackgroundImageLayout = ImageLayout.Stretch;
            pictureBox1.Dock = DockStyle.Fill;
            pictureBox1.Location = new Point(0, 31);
            pictureBox1.Name = "pictureBox1";
            pictureBox1.Size = new Size(290, 209);
            pictureBox1.TabIndex = 1;
            pictureBox1.TabStop = false;
            // 
            // Frm_Libretto
            // 
            AutoScaleDimensions = new SizeF(7F, 17F);
            AutoScaleMode = AutoScaleMode.Font;
            ClientSize = new Size(290, 240);
            Controls.Add(pictureBox1);
            Controls.Add(panel1);
            FormBorderStyle = FormBorderStyle.None;
            Name = "Frm_Libretto";
            Text = "Form2";
            Load += Frm_Libretto_Load;
            ((System.ComponentModel.ISupportInitialize)pictureBox1).EndInit();
            ResumeLayout(false);
        }

        #endregion

        private Panel panel1;
        private PictureBox pictureBox1;
    }
}

(6)生成效果

         三个窗体吸引在一起

         三个窗体被拖动分开

 

        主窗体吸引子窗体再吸引子窗体 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1600302.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【微信小程序之分包】

微信小程序之分包 什么是分包分包的好处分包前的结构图分包后的结构图分包的加载规则分包的体积限制使用分包打包原则引用原则独立分包独立分包的配置方法独立分包的引用原则分包预下载配置分包的预下载分包预下载限制 什么是分包 分包指的是把一个完整小程序项目&#xff0c;…

2016NOIP普及组真题 1. 金币

线上OJ&#xff1a; 一本通&#xff1a;http://ybt.ssoier.cn:8088/problem_show.php?pid1969 核心思想&#xff1a; 解法1、由于数据量只有 10000 天&#xff0c;估可以采用 模拟每一天 的方式。 #include <bits/stdc.h> using namespace std;int k 0;int main() {i…

掀起区块链开发狂潮!Scaffold-eth带你一键打造震撼DApp

文章目录 前言一、Scaffold-eth是什么&#xff1f;二、安装和配置1.准备工作2.安装3.配置开发环境 三、进阶使用1.放入自己的合约2.部署运行 总结 前言 前面的文章传送&#x1f6aa;&#xff1a;hardhat入门 与 hardhat进阶 在之前的文章中&#xff0c;我们已经探讨了使用Har…

《自动机理论、语言和计算导论》阅读笔记:p225-p260

《自动机理论、语言和计算导论》学习第 9 天&#xff0c;p225-p260总结&#xff0c;总计 26 页。 一、技术总结 1.pushdown automation(PDA&#xff0c;下推自动机) 2.DPDA Deterministic PDA(确定性下推自动机)。 二、英语总结 1.instantaneous (1)instant: adj. happi…

普发Pfeiffer TPG252 TPG256A SingleGaugeTPG261-262使用说明手侧

普发Pfeiffer TPG252 TPG256A SingleGaugeTPG261-262使用说明手侧

【产品经理修炼之道】- 厂商银业务之保兑仓

保兑仓 保兑仓是指供应商、购货商、银行签订三方协议&#xff0c;以银行信用为载体&#xff0c;以银行承兑汇票为结算工具&#xff0c;由银行控制货权&#xff0c;供应商受托保管货物并对银行承兑汇票保证金以外部分以货物回购为担保措施&#xff0c;购货商随缴保证金随提货而设…

实验一: 分析ARP解析过程

1.实验环境 主机A和主机B连接到交换机&#xff0c;并与一台路由器互连 2.需求描述 主机A和主机B连接到交换机&#xff0c;并与一台路由器互连主机A和主机B设置为同一网段&#xff0c;网关设置为路由接口地址查看ARP相关信息&#xff0c;熟悉在PC和Cisco设备上的常用命令 3.推…

9K star!利用 AI 大模型,一键生成高清短视频。效果还可以

原文链接: 9K star!利用 AI 大模型,一键生成高清短视频。效果还可以 现在失业三件套就是滴滴,外卖和自媒体,而且视频赛道也越来越卷了。 每一个搞自媒体的同学肯定都希望能有一个自动生成视频,或者剪辑的工具。 今天给大家介绍一个开源项目,就是可以根据一个主题或者…

Nginx内存池相关源码剖析(四)大块内存分配和释放逻辑

与小块内存不同&#xff0c;大块内存通常指的是那些大小较大、分配和释放频率相对较低的内存块。 ngx_palloc_large函数 当Nginx需要分配一块大块内存时&#xff0c;它通常会直接调用操作系统的内存分配函数&#xff08;如malloc、calloc或posix_memalign等&#xff09;。这些…

linux学习:进程(新建+运行某文件+退出处理函数+等待)

目录 api 创建新进程 注意 运行某文件 例子 注意 例子&#xff0c;等待进程 进程是由进程控制块、程序段、数据段三部分组成 进程有都有一个父进程&#xff0c;除了init&#xff0c;父进程可以创建子进程 每个进程都有一个PID&#xff0c;可以用ps来查看&#xff0c;等…

CC工具箱使用指南:【连接道路线(肖四成)】

一、简介 群友定制功能。 应用场景如下&#xff1a;有一组道路线&#xff0c;在交点处是打断的状态。线段有两个关键字段&#xff0c;分别为首尾编号&#xff1a; 这里要实现的是&#xff0c;将首尾编号交错相等的线段两两合并。比如这一组&#xff1a; 目的简单明了。因为是…

Console口和Telnet功能配置实验

一、基础配置 <Huawei>system-view //进入系统视图 Enter system view, return user view with CtrlZ. [Huawei]undo info-center enable //关闭接口提示 Info: Information center is disabled. [Huawei]sysname AR1 //配置设备名为 R1 [AR1]interface GigabitEthern…

高通 Android 12 源码编译aidl接口

最近在封装系统sdk接口 于是每次需要更新aidl接口 &#xff0c;传统方式一般使用make update-api或者修改Android.mk文件&#xff0c;今天我尝试使用Android.bp修改 &#xff0c;Android 10之前在Android.mk文件修改&#xff0c;这里不做赘述。下面开始尝试修改&#xff0c;其实…

SpringBoot编写一个SpringTask定时任务的方法

1&#xff0c;在启动类上添加注解 EnableScheduling//开启定时任务调度 2&#xff0c; 任务&#xff08;方法&#xff09;上也要添加注解&#xff1a; Scheduled(cron " 0 * * * * ? ") //每分钟执行一次 域&#xff1a; 秒 分 时 日 月 周 &#xff08;年&#…

5种方法,教你如何清理接口测试后的测试数据

在接口测试之后&#xff0c;清理测试数据是一个很重要的步骤&#xff0c;以确保下一次测试的准确性和一致性。以下是一些常见的测试数据清理方法&#xff1a; 1. 手动清理&#xff1a; 这是最基本的方法&#xff0c;即手动删除或重置测试数据。您可以通过访问数据库、控制台或…

Hyperledger Fabric

一.Hyperledger Fabric介绍 Hyperledger区块链全家桶 Hyperledger Fabric技术特性 资产 — 资产定义使得几乎任何具有货币价值的东西都可以在网络上交 换&#xff0c;包括从食品到古董汽车再到货币期货。链码 — 链码执行与交易排序的分离&#xff0c;限制了跨节点类型所需的…

HDLbits 刷题 --Mux2to1v

Create a 100-bit wide, 2-to-1 multiplexer. When sel0, choose a. When sel1, choose b. 译&#xff1a; 创建一个100位宽的2对1多路复用器。当sel0时&#xff0c;选择a。当sel1时&#xff0c;选择b。 module top_module( input [99:0] a, b,input sel,output [99:0] out …

DataGrip2024安装包(亲测可用)

目录 一、软件简介 二、软件下载 一、软件简介 DataGrip是由JetBrains公司开发的一款强大的关系数据库集成开发环境&#xff08;IDE&#xff09;&#xff0c;专为数据库开发人员和数据库管理员设计。它提供了一个统一的界面&#xff0c;用于管理和开发各种关系型数据库&#x…

个人微信API开发,API接口核心

API接口的核心 对于小白而言&#xff0c;初看API文档可能是一头雾水的——从哪里看&#xff0c;怎么看&#xff0c;看什么是摆在面前的问题。 其实对于产品经理而言&#xff0c;我们应该更关注这个公司可以提供什么样的API接口服务&#xff0c;比如我知道高德可以提供地图API&…

数据结构OJ:设计循环队列

题目介绍 本题为LeetCode上的经典题目&#xff0c;题目要求我们设计一种循环队列&#xff0c;满足FIFO原则且队尾被连接在队首之后。 思路讲解 题目中介绍循环队列的好处是可以重复利用空间&#xff0c;所以我们很容易想到在初始化时即开辟指定大小的空间&#xff0c;之后便不…