基於C#實現磁性吸附窗體
實踐過程
效果
代碼
public partial class Frm_Libretto : Form { public Frm_Libretto() { InitializeComponent(); } #region 公共變量 FrmClass Cla_FrmClass = new FrmClass(); #endregion private void Frm_Libretto_Load(object sender, EventArgs e) { this.Top = FrmClass.Example_Play_Top; this.Left = FrmClass.Example_Play_Left + FrmClass.Example_Play_Width; Cla_FrmClass.FrmInitialize(this); } private void panel_Title_MouseDown(object sender, MouseEventArgs e) { FrmClass.CPoint = new Point(-e.X, -e.Y); } private void panel_Title_MouseMove(object sender, MouseEventArgs e) { FrmClass.Example_Assistant_AdhereTo = false; FrmClass.Example_Libretto_AdhereTo = false; Cla_FrmClass.FrmMove(this, e); } private void panel_Title_MouseUp(object sender, MouseEventArgs e) { Cla_FrmClass.FrmPlace(this); } }
public partial class Frm_ListBox : Form { public Frm_ListBox() { InitializeComponent(); } #region 公共變量 FrmClass Cla_FrmClass = new FrmClass(); #endregion private void Frm_ListBox_Load(object sender, EventArgs e) { this.Left = FrmClass.Example_Play_Left; this.Top = FrmClass.Example_Play_Top + FrmClass.Example_Play_Height; Cla_FrmClass.FrmInitialize(this); } private void panel_Title_MouseDown(object sender, MouseEventArgs e) { FrmClass.CPoint = new Point(-e.X, -e.Y); } private void panel_Title_MouseMove(object sender, MouseEventArgs e) { FrmClass.Example_Assistant_AdhereTo = false; FrmClass.Example_List_AdhereTo = false; Cla_FrmClass.FrmMove(this, e); } private void panel_Title_MouseUp(object sender, MouseEventArgs e) { Cla_FrmClass.FrmPlace(this); } }
public partial class Frm_Play : Form { public Frm_Play() { InitializeComponent(); } #region 公共變量 FrmClass Cla_FrmClass = new FrmClass(); public static Form F_List = new Form(); public static Form F_Libretto = new Form(); public static Form F_Screen = new Form(); #endregion private void Frm_Play_Load(object sender, EventArgs e) { //窗體位置的初始化 Cla_FrmClass.FrmInitialize(this); } private void panel_Title_MouseDown(object sender, MouseEventArgs e) { int Tem_Y = 0; if (e.Button == MouseButtons.Left) //按下的是否為鼠標左鍵 { Cla_FrmClass.FrmBackCheck(); //檢測各窗體是否連在一起 Tem_Y = e.Y; FrmClass.FrmPoint = new Point(e.X, Tem_Y); //獲取鼠標在窗體上的位置,用於磁性窗體 FrmClass.CPoint = new Point(-e.X, -Tem_Y); //獲取鼠標在屏幕上的位置,用於窗體的移動 if (FrmClass.Example_List_AdhereTo) //如果與frm_ListBox窗體相連接 { Cla_FrmClass.FrmDistanceJob(this, F_List); //計算窗體的距離差 if (FrmClass.Example_Assistant_AdhereTo) //兩個輔窗體是否連接在一起 { Cla_FrmClass.FrmDistanceJob(this, F_Libretto); //計算窗體的距離差 } } if (FrmClass.Example_Libretto_AdhereTo) //如果與frm_Libretto窗體相連接 { Cla_FrmClass.FrmDistanceJob(this, F_Libretto); //計算窗體的距離差 if (FrmClass.Example_Assistant_AdhereTo) //兩個輔窗體是否連接在一起 { Cla_FrmClass.FrmDistanceJob(this, F_List); //計算窗體的距離差 } } } } private void panel_Title_MouseMove(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) //按下的是否為鼠標左鍵 { Cla_FrmClass.FrmMove(this, e); //利用控件移動窗體 if (FrmClass.Example_List_AdhereTo) //如果frm_ListBox窗體與主窗體連接 { Cla_FrmClass.ManyFrmMove(this, e, F_List); //磁性窗體的移動 Cla_FrmClass.FrmInitialize(F_List); //對frm_ListBox窗體的位置進行初始化 if (FrmClass.Example_Assistant_AdhereTo) //如果兩個子窗體連接在一起 { Cla_FrmClass.ManyFrmMove(this, e, F_Libretto); Cla_FrmClass.FrmInitialize(F_Libretto); } } if (FrmClass.Example_Libretto_AdhereTo) //如果frm_Libretto窗體與主窗體連接 { Cla_FrmClass.ManyFrmMove(this, e, F_Libretto); Cla_FrmClass.FrmInitialize(F_Libretto); if (FrmClass.Example_Assistant_AdhereTo) { Cla_FrmClass.ManyFrmMove(this, e, F_List); Cla_FrmClass.FrmInitialize(F_List); } } Cla_FrmClass.FrmInitialize(this); } } private void panel_Title_MouseUp(object sender, MouseEventArgs e) { Cla_FrmClass.FrmPlace(this); } private void Frm_Play_Shown(object sender, EventArgs e) { //顯示列表窗體 F_List = new Frm_ListBox(); F_List.ShowInTaskbar = false; FrmClass.Example_ListShow = true; F_List.Show(); //顯示歌詞窗體 F_Libretto = new Frm_Libretto(); F_Libretto.ShowInTaskbar = false; FrmClass.Example_LibrettoShow = true; F_Libretto.Show(); F_Libretto.Left = this.Left + this.Width; F_Libretto.Top = this.Top; //各窗體位置的初始化 Cla_FrmClass.FrmInitialize(F_List); Cla_FrmClass.FrmInitialize(F_Libretto); } private void panel_Close_Click(object sender, EventArgs e) { F_List.Close(); F_List.Dispose(); F_Libretto.Close(); F_Libretto.Dispose(); F_Screen.Close(); F_Screen.Dispose(); this.Close(); } private void panel_Title_Click(object sender, EventArgs e) { F_List.Focus(); F_Libretto.Focus(); this.Focus(); } }
class FrmClass { #region 磁性窗體-公共變量 //記錄窗體的隱藏與顯示 public static bool Example_ListShow = false; public static bool Example_LibrettoShow = false; public static bool Example_ScreenShow = false; //記錄鼠標的當前位置 public static Point CPoint; //添加命名空間using System.Drawing; public static Point FrmPoint; public static int Example_FSpace = 10; //設置窗體間的距離 //Frm_Play窗體的位置及大小 public static int Example_Play_Top = 0; public static int Example_Play_Left = 0; public static int Example_Play_Width = 0; public static int Example_Play_Height = 0; public static bool Example_Assistant_AdhereTo = false; //輔助窗體是否磁性在一起 //Frm_ListBos窗體的位置及大小 public static int Example_List_Top = 0; public static int Example_List_Left = 0; public static int Example_List_Width = 0; public static int Example_List_Height = 0; public static bool Example_List_AdhereTo = false; //輔助窗體是否與主窗體磁性在一起 //Frm_Libretto窗體的位置及大小 public static int Example_Libretto_Top = 0; public static int Example_Libretto_Left = 0; public static int Example_Libretto_Width = 0; public static int Example_Libretto_Height = 0; public static bool Example_Libretto_AdhereTo = false; //輔助窗體是否與主窗體磁性在一起 //窗體之間的距離差 public static int Example_List_space_Top = 0; public static int Example_List_space_Left = 0; public static int Example_Libretto_space_Top = 0; public static int Example_Libretto_space_Left = 0; #endregion #region 檢測各窗體是否連接在一起 /// <summary> /// 檢測各窗體是否連接在一起 /// </summary> public void FrmBackCheck() { bool Tem_Magnetism = false; //Frm_ListBos與主窗體 Tem_Magnetism = false; if ((Example_Play_Top - Example_List_Top) == 0) Tem_Magnetism = true; if ((Example_Play_Left - Example_List_Left) == 0) Tem_Magnetism = true; if ((Example_Play_Left - Example_List_Left - Example_List_Width) == 0) Tem_Magnetism = true; if ((Example_Play_Left - Example_List_Left + Example_List_Width) == 0) Tem_Magnetism = true; if ((Example_Play_Top - Example_List_Top - Example_List_Height) == 0) Tem_Magnetism = true; if ((Example_Play_Top - Example_List_Top + Example_List_Height) == 0) Tem_Magnetism = true; if (Tem_Magnetism) Example_List_AdhereTo = true; //Frm_Libretto與主窗體 Tem_Magnetism = false; if ((Example_Play_Top - Example_Libretto_Top) == 0) Tem_Magnetism = true; if ((Example_Play_Left - Example_Libretto_Left) == 0) Tem_Magnetism = true; if ((Example_Play_Left - Example_Libretto_Left - Example_Libretto_Width) == 0) Tem_Magnetism = true; if ((Example_Play_Left - Example_Libretto_Left + Example_Libretto_Width) == 0) Tem_Magnetism = true; if ((Example_Play_Top - Example_Libretto_Top - Example_Libretto_Height) == 0) Tem_Magnetism = true; if ((Example_Play_Top - Example_Libretto_Top + Example_Libretto_Height) == 0) Tem_Magnetism = true; if (Tem_Magnetism) Example_Libretto_AdhereTo = true; //兩個輔窗體 Tem_Magnetism = false; if ((Example_List_Top - Example_Libretto_Top) == 0) Tem_Magnetism = true; if ((Example_List_Left - Example_Libretto_Left) == 0) Tem_Magnetism = true; if ((Example_List_Left - Example_Libretto_Left - Example_Libretto_Width) == 0) Tem_Magnetism = true; if ((Example_List_Left - Example_Libretto_Left + Example_Libretto_Width) == 0) Tem_Magnetism = true; if ((Example_List_Top - Example_Libretto_Top - Example_Libretto_Height) == 0) Tem_Magnetism = true; if ((Example_List_Top - Example_Libretto_Top + Example_Libretto_Height) == 0) Tem_Magnetism = true; if (Tem_Magnetism) Example_Assistant_AdhereTo = true; } #endregion #region 利用窗體上的控件移動窗體 /// <summary> /// 利用控件移動窗體 /// </summary> /// <param Frm="Form">窗體</param> /// <param e="MouseEventArgs">控件的移動事件</param> public void FrmMove(Form Frm, MouseEventArgs e) //Form或MouseEventArgs添加命名空間using System.Windows.Forms; { 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 void FrmDistanceJob(Form Frm, Form Follow) { switch (Follow.Name) { case "Frm_ListBox": { Example_List_space_Top = Follow.Top - Frm.Top; Example_List_space_Left = Follow.Left - Frm.Left; break; } case "Frm_Libretto": { Example_Libretto_space_Top = Follow.Top - Frm.Top; Example_Libretto_space_Left = Follow.Left - Frm.Left; break; } } } #endregion #region 磁性窗體的移動 /// <summary> /// 磁性窗體的移動 /// </summary> /// <param Frm="Form">窗體</param> /// <param e="MouseEventArgs">控件的移動事件</param> /// <param Follow="Form">跟隨窗體</param> public void ManyFrmMove(Form Frm, MouseEventArgs e, Form Follow) //Form或MouseEventArgs添加命名空間using System.Windows.Forms; { 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 = Example_List_space_Top - FrmPoint.Y; Tem_Left = Example_List_space_Left - FrmPoint.X; break; } case "Frm_Libretto": { Tem_Top = Example_Libretto_space_Top - FrmPoint.Y; Tem_Left = Example_Libretto_space_Left - FrmPoint.X; break; } } myPosittion.Offset(Tem_Left, Tem_Top); Follow.DesktopLocation = myPosittion; } } #endregion #region 對窗體的位置進行初始化 /// <summary> /// 對窗體的位置進行初始化 /// </summary> /// <param Frm="Form">窗體</param> public void FrmInitialize(Form Frm) { switch (Frm.Name) { case "Frm_Play": { Example_Play_Top = Frm.Top; Example_Play_Left = Frm.Left; Example_Play_Width = Frm.Width; Example_Play_Height = Frm.Height; break; } case "Frm_ListBox": { Example_List_Top = Frm.Top; Example_List_Left = Frm.Left; Example_List_Width = Frm.Width; Example_List_Height = Frm.Height; break; } case "Frm_Libretto": { Example_Libretto_Top = Frm.Top; Example_Libretto_Left = Frm.Left; Example_Libretto_Width = Frm.Width; Example_Libretto_Height = Frm.Height; break; } } } #endregion #region 存儲各窗體的當前信息 /// <summary> /// 存儲各窗體的當前信息 /// </summary> /// <param Frm="Form">窗體</param> /// <param e="MouseEventArgs">控件的移動事件</param> public void FrmPlace(Form Frm) { FrmInitialize(Frm); FrmMagnetism(Frm); } #endregion #region 窗體的磁性設置 /// <summary> /// 窗體的磁性設置 /// </summary> /// <param Frm="Form">窗體</param> public void FrmMagnetism(Form Frm) { if (Frm.Name != "Frm_Play") { FrmMagnetismCount(Frm, Example_Play_Top, Example_Play_Left, Example_Play_Width, Example_Play_Height, "Frm_Play"); } if (Frm.Name != "Frm_ListBos") { FrmMagnetismCount(Frm, Example_List_Top, Example_List_Left, Example_List_Width, Example_List_Height, "Frm_ListBos"); } if (Frm.Name != "Frm_Libratto") { FrmMagnetismCount(Frm, Example_Libretto_Top, Example_Libretto_Left, Example_Libretto_Width, Example_Libretto_Height, "Frm_Libratto"); } FrmInitialize(Frm); } #endregion #region 磁性窗體的計算 /// <summary> /// 磁性窗體的計算 /// </summary> /// <param Frm="Form">窗體</param> /// <param e="MouseEventArgs">控件的移動事件</param> public 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) <= Example_FSpace && (Frm.Top + Frm.Height - top) >= -Example_FSpace) { //當一個主窗體不包含輔窗體時 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) <= Example_FSpace && (Frm.Left - left) >= -Example_FSpace) 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) <= Example_FSpace && (Frm.Left - left) >= -Example_FSpace) Frm.Left = left; Tem_Magnetism = true; } } //下面進行磁性窗體 if ((Frm.Top - (top + height)) <= Example_FSpace && (Frm.Top - (top + height)) >= -Example_FSpace) { //當一個主窗體不包含輔窗體時 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) <= Example_FSpace && (Frm.Left - left) >= -Example_FSpace) Frm.Left = left; Tem_Magnetism = true; } //當一個主窗體包含輔窗體時 if (Frm.Left <= left && (Frm.Left + Frm.Width) >= (left + width)) { Frm.Top = top + height; if ((Frm.Left - left) <= Example_FSpace && (Frm.Left - left) >= -Example_FSpace) Frm.Left = left; Tem_Magnetism = true; } } //左面進行磁性窗體 if ((Frm.Left + Frm.Width - left) <= Example_FSpace && (Frm.Left + Frm.Width - left) >= -Example_FSpace) { //當一個主窗體不包含輔窗體時 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) <= Example_FSpace && (Frm.Top - top) >= -Example_FSpace) 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) <= Example_FSpace && (Frm.Top - top) >= -Example_FSpace) Frm.Top = top; Tem_Magnetism = true; } } //右面進行磁性窗體 if ((Frm.Left - (left + width)) <= Example_FSpace && (Frm.Left - (left + width)) >= -Example_FSpace) { //當一個主窗體不包含輔窗體時 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) <= Example_FSpace && (Frm.Top - top) >= -Example_FSpace) Frm.Top = top; Tem_Magnetism = true; } //當一個主窗體包含輔窗體時 if (Frm.Top <= top && (Frm.Top + Frm.Height) >= (top + height)) { Frm.Left = left + width; if ((Frm.Top - top) <= Example_FSpace && (Frm.Top - top) >= -Example_FSpace) 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 == "") { Example_Assistant_AdhereTo = Tem_Magnetism; } else { switch (Tem_AssistForm) { case "Frm_ListBos": Example_List_AdhereTo = Tem_Magnetism; break; case "Frm_Libratto": Example_Libretto_AdhereTo = Tem_Magnetism; break; } } } #endregion #region 恢復窗體的初始大小 /// <summary> /// 恢復窗體的初始大小(當松開鼠標時,如果窗體的大小小於300*200,恢復初始狀態) /// </summary> /// <param Frm="Form">窗體</param> public 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 }
static class Program { /// <summary> /// 應用程序的主入口點。 /// </summary> [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Frm_Play()); } }
到此這篇關於基於C#實現磁性吸附窗體的文章就介紹到這瞭,更多相關C#磁性吸附窗體內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!