C# Winform多窗口间切换
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# Winform多窗口间切换相关的知识,希望对你有一定的参考价值。
有一个主页面(不是用于登录),一个选项页面。
1、打开程序时,只出现主页面;
2、单击主页面的一个按钮,实现主页面关闭(或隐藏)、选项页面打开;
3、关闭选项页面(单击窗口上的“X”,或者单击选项页面上的一个按钮)时,选项页面关闭,主页面出现;
private void button1_click(object sender,EventArgs e)
Form2 frm_item=new Form2();
frm_item.Show();
this.Hide();
选项界面 Form2:
private void Form2_FormClosing(object sender,FormClosingEventArgs e)
Form1 frm_main=new Form1();
frm_main.Show();
这样做等于重新加载了一个新的主界面,如果要原来的那个的话,你可以在原主界面中新建一个线程来检测,当Form2关闭时,线程执行base.Show();或者你也可以在new Form2(this)时把Form1传过来,再在Form2的构造函数中接收,当Form2关闭时执行Form1.Show();//接收的追问
能把线程操作的方法,再详细说下么,多这个不熟悉啊
追答你可以在Form1中新建的线程中设置一个bool类型的变量为false,当监测Form2执行关闭时,改变bool类型变量的值为true,当变量为true时,线程执行Form1的显示
和一个线程操作另外一个线程里的控件有点相近
private void button1_Click(object sender, EventArgs e)
this.Opacity = 0; //或者this.Hide();
Form form2 = new Form();
form2.ShowDialog();
this.Opacity = 100; //或者this.Show();
参考技术C Form1 中加个打开Form2按钮
private void 打开Form2按钮(object sender, EventArgs e)
Form2 f = new Form2();
f.Owner = this;
f.Show();
参考技术D Hide()
Show() 呗,在窗口Closed()里面写就是了
窗体切换特效
C# 实现磁性窗口(附源码和程序)
实现并封装了磁性窗口类MagneticMagnager,实现磁性窗口仅仅需要调用一行代码: MagneticMagnager test2 = new MagneticMagnager(this, fm2, MagneticPosition.Top); 插图: 具体操作: 1.新建winform项目MagneticForm,并添加磁性窗口操作类MagneticMagnager: [c-sharp] view plaincopy 1. using System; 2. using System.Drawing; 3. 4. namespace System.Windows.Forms 5. 6. public class MagneticMagnager 7. 8. MagneticPosition Pos;//位置属性 9. Form MainForm, ChildForm; 10. bool IsFirstPos;//是否第一次定位ChildForm子窗体 11. public int step;//磁性子窗体ChildForm移动步长 12. public Point LocationPt;//定位点 13. delegate void LocationDel();//移动子窗体的委托 14. public MagneticMagnager(Form _MainForm, Form _ChildForm, MagneticPosition _pos) 15. 16. IsFirstPos = false; 17. step = 20; 18. MainForm = _MainForm; 19. ChildForm = _ChildForm; 20. Pos = _pos; 21. MainForm.LocationChanged += new EventHandler(MainForm_LocationChanged); 22. ChildForm.LocationChanged += new EventHandler(ChildForm_LocationChanged); 23. MainForm.SizeChanged += new EventHandler(MainForm_SizeChanged); 24. ChildForm.SizeChanged += new EventHandler(ChildForm_SizeChanged); 25. ChildForm.Load+=new EventHandler(ChildForm_Load); 26. MainForm.Load+=new EventHandler(MainForm_Load); 27. 28. void ChildForm_Load(object sender, EventArgs e) 29. 30. GetLocation(); 31. 32. void MainForm_Load(object sender, EventArgs e) 33. 34. GetLocation(); 35. 36. void MainForm_LocationChanged(object sender, EventArgs e) 37. 38. GetLocation(); 39. 40. void MainForm_SizeChanged(object sender, EventArgs e) 41. 42. GetLocation(); 43. 44. void ChildForm_SizeChanged(object sender, EventArgs e) 45. 46. GetLocation(); 47. 48. void GetLocation()//定位子窗体 49. 50. if (ChildForm == null) 51. return; 52. if (Pos == MagneticPosition.Left) 53. LocationPt = new Point(MainForm.Left - ChildForm.Width, MainForm.Top); 54. else if (Pos == MagneticPosition.Top) 55. LocationPt = new Point(MainForm.Left, MainForm.Top - ChildForm.Height); 56. else if (Pos == MagneticPosition.Right) 57. LocationPt = new Point(MainForm.Right, MainForm.Top); 58. else if (Pos == MagneticPosition.Bottom) 59. LocationPt = new Point(MainForm.Left, MainForm.Bottom); 60. ChildForm.Location = LocationPt; 61. 62. void ChildForm_LocationChanged(object sender, EventArgs e)//当窗体位置移动后 63. 64. if (!IsFirstPos) 65. 66. IsFirstPos = true; 67. return; 68. 69. LocationDel del = new LocationDel(OnMove);//委托 70. MainForm.BeginInvoke(del);//调用 71. 72. 73. void OnMove()//移动子窗体 74. 75. if (ChildForm.Left > LocationPt.X) 76. if (ChildForm.Left - LocationPt.X > step) 77. ChildForm.Left -= step; 78. else 79. ChildForm.Left = LocationPt.X; 80. else if (ChildForm.Left < LocationPt.X) 81. if (ChildForm.Left - LocationPt.X < -step) 82. ChildForm.Left += step; 83. else 84. ChildForm.Left = LocationPt.X; 85. if (ChildForm.Top > LocationPt.Y) 86. if (ChildForm.Top - LocationPt.Y > step) 87. ChildForm.Top -= step; 88. else 89. ChildForm.Top = LocationPt.Y; 90. 91. else if (ChildForm.Top < LocationPt.Y) 92. if (ChildForm.Top - LocationPt.Y < -step) 93. ChildForm.Top += step; 94. else 95. ChildForm.Top = LocationPt.Y; 96. 97. 98. public enum MagneticPosition//磁性窗体的位置属性 99. 100. Left = 0, 101. Top = 1, 102. Right = 2, 103. Bottom = 3 104. 105. 2.添加MainForm主窗体,打开Program.cs文件,修改为如下 : [c-sharp] view plaincopy 1. static void Main() 2. 3. Application.EnableVisualStyles(); 4. Application.SetCompatibleTextRenderingDefault(false); 5. Application.Run(new MainForm()); 6. 3.添加ChildForm子窗体,不用写任何代码,当然实际中根据你自己的设计决定 4.在MainForm中添加四个button,分别设置text属性为:"左磁性" "上磁性" "右磁性" 下磁性" ,并分别添加按钮点击事件,具体代码如下: [c-sharp] view plaincopy 1. using System; 2. using System.Collections.Generic; 3. using System.ComponentModel; 4. using System.Data; 5. using System.Drawing; 6. using System.Linq; 7. using System.Text; 8. using System.Windows.Forms; 9. 10. namespace WindowsFormsApplication1 11. 12. public partial class MainForm : Form 13. 14. public MainForm() 15. 16. InitializeComponent(); 17. 18. ChildForm fm1, fm2, fm3, fm4; 19. private void button1_Click(object sender, EventArgs e) 20. 21. //左磁性 22. if (fm1 == null) 23. 24. fm1 = new ChildForm(); 25. MagneticMagnager test1 = new MagneticMagnager(this, fm1, MagneticPosition.Left); 26. fm1.Show(); 27. 28. else 29. 30. fm1.Close(); 31. fm1 = null; 32. 33. 34. 35. private void button4_Click(object sender, EventArgs e) 36. 37. //上磁性 38. if (fm2 == null) 39. 40. fm2 = new ChildForm(); 41. MagneticMagnager test2 = new MagneticMagnager(this, fm2, MagneticPosition.Top); 42. fm2.Show(); 43. 44. else 45. 46. fm2.Close(); 47. fm2 = null; 48. 49. 50. 51. private void button3_Click(object sender, EventArgs e) 52. 53. //右磁性 54. if (fm3 == null) 55. 56. fm3 = new ChildForm(); 57. MagneticMagnager test3 = new MagneticMagnager(this, fm3, MagneticPosition.Right); 58. fm3.Show(); 59. 60. else 61. 62. fm3.Close(); 63. fm3 = null; 64. 65. 66. 67. private void button2_Click(object sender, EventArgs e) 68. 69. //下磁性 70. if (fm4 == null) 71. 72. fm4 = new ChildForm(); 73. MagneticMagnager test4 = new MagneticMagnager(this, fm4, MagneticPosition.Bottom); 74. fm4.Show(); 75. 76. else 77. 78. fm4.Close(); 79. fm4 = null; 80. 81. 82. 83.
using System; using System.Drawing; namespace System.Windows.Forms public class MagneticMagnager MagneticPosition Pos;//位置属性 Form MainForm, ChildForm; bool IsFirstPos;//是否第一次定位ChildForm子窗体 public int step;//磁性子窗体ChildForm移动步长 public Point LocationPt;//定位点 delegate void LocationDel();//移动子窗体的委托 public MagneticMagnager(Form _MainForm, Form _ChildForm, MagneticPosition _pos) IsFirstPos = false; step = 20; MainForm = _MainForm; ChildForm = _ChildForm; Pos = _pos; MainForm.LocationChanged += new EventHandler(MainForm_LocationChanged); ChildForm.LocationChanged += new EventHandler(ChildForm_LocationChanged); MainForm.SizeChanged += new EventHandler(MainForm_SizeChanged); ChildForm.SizeChanged += new EventHandler(ChildForm_SizeChanged); ChildForm.Load+=new EventHandler(ChildForm_Load); MainForm.Load+=new EventHandler(MainForm_Load); void ChildForm_Load(object sender, EventArgs e) GetLocation(); void MainForm_Load(object sender, EventArgs e) GetLocation(); void MainForm_LocationChanged(object sender, EventArgs e) GetLocation(); void MainForm_SizeChanged(object sender, EventArgs e) GetLocation(); void ChildForm_SizeChanged(object sender, EventArgs e) GetLocation(); void GetLocation()//定位子窗体 if (ChildForm == null) return; if (Pos == MagneticPosition.Left) LocationPt = new Point(MainForm.Left - ChildForm.Width, MainForm.Top); else if (Pos == MagneticPosition.Top) LocationPt = new Point(MainForm.Left, MainForm.Top - ChildForm.Height); else if (Pos == MagneticPosition.Right) LocationPt = new Point(MainForm.Right, MainForm.Top); else if (Pos == MagneticPosition.Bottom) LocationPt = new Point(MainForm.Left, MainForm.Bottom); ChildForm.Location = LocationPt; void ChildForm_LocationChanged(object sender, EventArgs e)//当窗体位置移动后 if (!IsFirstPos) IsFirstPos = true; return; LocationDel del = new LocationDel(OnMove);//委托 MainForm.BeginInvoke(del);//调用 void OnMove()//移动子窗体 if (ChildForm.Left > LocationPt.X) if (ChildForm.Left - LocationPt.X > step) ChildForm.Left -= step; else ChildForm.Left = LocationPt.X; else if (ChildForm.Left < LocationPt.X) if (ChildForm.Left - LocationPt.X < -step) ChildForm.Left += step; else ChildForm.Left = LocationPt.X; if (ChildForm.Top > LocationPt.Y) if (ChildForm.Top - LocationPt.Y > step) ChildForm.Top -= step; else ChildForm.Top = LocationPt.Y; else if (ChildForm.Top < LocationPt.Y) if (ChildForm.Top - LocationPt.Y < -step) ChildForm.Top += step; else ChildForm.Top = LocationPt.Y; public enum MagneticPosition//磁性窗体的位置属性 Left = 0, Top = 1, Right = 2, Bottom = 3 static void Main() Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new MainForm()); 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 WindowsFormsApplication1 public partial class MainForm : Form public MainForm() InitializeComponent(); ChildForm fm1, fm2, fm3, fm4; private void button1_Click(object sender, EventArgs e) //左磁性 if (fm1 == null) fm1 = new ChildForm(); MagneticMagnager test1 = new MagneticMagnager(this, fm1, MagneticPosition.Left); fm1.Show(); else fm1.Close(); fm1 = null; private void button4_Click(object sender, EventArgs e) //上磁性 if (fm2 == null) fm2 = new ChildForm(); MagneticMagnager test2 = new MagneticMagnager(this, fm2, MagneticPosition.Top); fm2.Show(); else fm2.Close(); fm2 = null; private void button3_Click(object sender, EventArgs e) //右磁性 if (fm3 == null) fm3 = new ChildForm(); MagneticMagnager test3 = new MagneticMagnager(this, fm3, MagneticPosition.Right); fm3.Show(); else fm3.Close(); fm3 = null; private void button2_Click(object sender, EventArgs e) //下磁性 if (fm4 == null) fm4 = new ChildForm(); MagneticMagnager test4 = new MagneticMagnager(this, fm4, MagneticPosition.Bottom); fm4.Show(); else fm4.Close(); fm4 = null;
C#后台调用前台javascript的五种方法
C#后台调用前台javascript的五种方法 转自:http://blog.csdn.net/joetao/article/details/3383280 由于项目需要,用到其他项目组用VC开发的组件,在web后台代码无法访问这个组件,所以只好通过后台调用前台的javascript,从而操作这个组件。在网上找了找,发现有三种方法可以访问到前台代码: 第一种,OnClientClick (vs2003不支持这个方法) <asp:Button ID="Button1" runat="server" Text="Button" OnClientClick="client_click()" OnClick="Button1_Click" /> client_click() 就是javascript的一个方法。 第二种,Button1.Attributes.Add("onclick", "return Client_Click()"); “Client_Click() “是一个前台方法,可以替换成一般的脚本如:retrun confirm(‘确定删除吗?‘) 第三种,是我自认为最灵活的一种,ClientScript.RegisterStartupScript 例子:StringBuilder sb = new StringBuilder(); sb.Append("<script language=‘javascript‘>"); sb.Append("Button2_onclick(‘" + serverPath + "‘)"); sb.Append("</script>"); ClientScript.RegisterStartupScript(this.GetType(), "LoadPicScript", sb.ToString()); 第四种. 用Response.Write方法写入脚本 比如在你单击按钮后,先操作数据库,完了后显示已经完成,可以在最后想调用的地方写上 Response.Write("<script type=‘text/javascript‘>alert();</script>"); 这个方法有个缺陷就是不能调用脚本文件中的自定义的函数,只能调用内部函数,具体调用自定义的函数只能在Response.Write写上函数定义,比如Response.Write("<script type=‘text/javascript‘>function myfun()...</script>"); 第五种 用ClientScript类动态添加脚本 用法如下:在想调用某个javascript脚本函数的地方添加代码,注意要保证MyFun已经在脚本文件中定义过了。 ClientScript.RegisterStartupScript(ClientScript.GetType(), "myscript", "<script>MyFun();</script>"); 这个方法比Response.Write更方便一些,可以直接调用脚本文件中的自定义函数。
C#桌面磁性窗体
转自:http://kb.cnblogs.com/a/1547320/ 看到千千静听的窗口可以在接近屏幕边缘时贴在边缘上觉得不错,自己也有这个需要,所以写了这个方法,测试了感觉还蛮不错的,哈哈~ 使用的时候只要在想应用的窗体的Form_Move(object sender,EventAges e)事件里面调用即可 ps:不过有时窗体可能会比较闪,这个可能是代码还有待改善,或者是在Form_Move事件里面来调用不大合适,反正功能是实现了,要是哪位有更好的方法,欢迎回复交流一下啊~ /// <summary> /// 磁性窗体函数 /// </summary> /// <param name="form">窗体控件(一般传this即可)</param> /// <param name="space">自定义的与屏幕边缘的距离</param> /// <param name="isWorkingArea">是否在屏幕工作区进行该操作(true表示不包括任务栏,false则包括整个屏幕的范围)</param> public void Form_Welt(Control form, int space, bool isWorkingArea) //获取窗体的左上角的x,y坐标 int x = form.Location.X; int y = form.Location.Y; int sW = 0; int sH = 0; if (isWorkingArea) //获取屏幕的工作区(不包括任务栏)的宽度和高度 sW = Screen.PrimaryScreen.WorkingArea.Width; sH = Screen.PrimaryScreen.WorkingArea.Height; else //获取整个屏幕(包括任务栏)的宽度和高度 sW = Screen.PrimaryScreen.Bounds.Width; sH = Screen.PrimaryScreen.Bounds.Height; //如果窗体的左边缘和屏幕左边缘的距离在用户定义的范围内,则执行左贴边 if ((x <= space && x > 0) || (Math.Abs(x) <= space && x < 0)) //Math.Abs(x)是取绝对值 form.Location = new Point(0, y); //如果窗体的上边缘和屏幕上边缘的距离在用户定义的范围内,则执行上贴边 if ((y <= space && y > 0) || (Math.Abs(y) <= space && y < 0)) form.Location = new Point(x, 0); //窗体右边缘跟屏幕右边缘的距离 int rightW = sW - form.Right; //窗体下边缘跟屏幕下边缘的距离 int bottomW = sH - form.Bottom; //判断右边的情况 if ((rightW <= space && form.Right < sW) || (Math.Abs(rightW) <= space && rightW < 0)) form.Location = new Point(sW - form.Width, y); //判断下边的情况 if ((bottomW <= 10 && form.Bottom < sH) || (Math.Abs(bottomW) <= space && bottomW < 0)) form.Location = new Point(x, sH - form.Height);
Form1
sing System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Runtime.InteropServices; namespace WindowsApplication1 public partial class Form1 : Form [DllImport(@"clayui_forcsharp.dll")] public static extern void CLAYUI_CSharp_Init(IntPtr handle); [DllImport(@"clayui_forcsharp.dll")] public static extern void CLAYUI_CSharp_Release(); [DllImport(@"clayui_forcsharp.dll")] public static extern void CLAYUI_OnAnimation(IntPtr handle, int vert, int flag, int anitype, int invert); [DllImport(@"clayui_forcsharp.dll")] public static extern void Redraw(IntPtr handle, int usetime); [DllImport(@"clayui_forcsharp.dll")] public static extern int IsPlay(); [DllImport(@"clayui_forcsharp.dll")] public static extern void CLAYUI_InitDialog2(IntPtr handle, IntPtr handle1); [DllImport(@"clayui_forcsharp.dll")] public static extern void MakeWindowTpt(IntPtr handle, int factor); [DllImport(@"clayui_forcsharp.dll")] public static extern void WinRedraw(IntPtr handle, int redraw); [DllImport(@"clayui_forcsharp.dll")] public static extern void desktomemdc1(IntPtr handle); public int m_isredraw = 1; public Form1() InitializeComponent(); private void Form1_Load(object sender, EventArgs e) IntPtr handle = this.Handle; CLAYUI_CSharp_Init(handle); protected override void WndProc(ref Message m) base.WndProc(ref m); protected override void OnPaint(PaintEventArgs e) IntPtr handle = this.Handle; if (m_isredraw == 1) base.OnPaint(e); public void EnableControl(int isenable) foreach (System.Windows.Forms.Control control in this.Controls) Form1.WinRedraw(control.Handle, isenable); private void button1_Click(object sender, EventArgs e) IntPtr handle = this.Handle; IntPtr h1 = (IntPtr)0, h2 = (IntPtr)0; CLAYUI_OnAnimation(handle, 0, 1, 0, 0); Form2 f2 = new Form2(); f2.m_f1 = this; f2.ShowDialog(); private void Form1_Shown(object sender, EventArgs e) IntPtr handle = this.Handle; private void Form1_Paint(object sender, PaintEventArgs e) IntPtr handle = this.Handle; private void Form1_FormClosed(object sender, FormClosedEventArgs e) CLAYUI_CSharp_Release(); public void StartTimer() timer1.Start(); private void timer1_Tick(object sender, EventArgs e) IntPtr handle = this.Handle; if (IsPlay() == 0) EnableControl(1); timer1.Stop(); else Redraw(handle, 1); private void button3_Click(object sender, EventArgs e) IntPtr handle = this.Handle; IntPtr h1 = (IntPtr)0, h2 = (IntPtr)0; CLAYUI_OnAnimation(handle, 0, 2, 1, 0); Form2 f2 = new Form2(); f2.m_f1 = this; f2.ShowDialog(); private void button4_Click(object sender, EventArgs e) IntPtr handle = this.Handle; IntPtr h1 = (IntPtr)0, h2 = (IntPtr)0; CLAYUI_OnAnimation(handle, 0, 0, 4, 0); Form2 f2 = new Form2(); f2.m_f1 = this; f2.ShowDialog(); private void button5_Click(object sender, EventArgs e) IntPtr handle = this.Handle; IntPtr h1 = (IntPtr)0, h2 = (IntPtr)0; CLAYUI_OnAnimation(handle, 0, 0, 2, 0); Form2 f2 = new Form2(); f2.m_f1 = this; f2.ShowDialog(); private void button6_Click(object sender, EventArgs e) IntPtr handle = this.Handle; IntPtr h1 = (IntPtr)0, h2 = (IntPtr)0; CLAYUI_OnAnimation(handle, 0, 0, 3, 0); Form2 f2 = new Form2(); f2.m_f1 = this; f2.ShowDialog(); private void button7_Click(object sender, EventArgs e) IntPtr handle = this.Handle; IntPtr h1 = (IntPtr)0, h2 = (IntPtr)0; CLAYUI_OnAnimation(handle, 0, 0, 5, 0); Form2 f2 = new Form2(); f2.m_f1 = this; f2.ShowDialog(); private void button8_Click(object sender, EventArgs e) IntPtr handle = this.Handle; IntPtr h1 = (IntPtr)0, h2 = (IntPtr)0; CLAYUI_OnAnimation(handle, 0, 0, 6, 0); Form2 f2 = new Form2(); f2.m_f1 = this; f2.ShowDialog(); private void button9_Click(object sender, EventArgs e) IntPtr handle = this.Handle; IntPtr h1 = (IntPtr)0, h2 = (IntPtr)0; CLAYUI_OnAnimation(handle, 0, 0, 7, 0); Form2 f2 = new Form2(); f2.m_f1 = this; f2.ShowDialog(); private void button10_Click(object sender, EventArgs e) IntPtr handle = this.Handle; IntPtr h1 = (IntPtr)0, h2 = (IntPtr)0; CLAYUI_OnAnimation(handle, 0, 3, 8, 0); Form2 f2 = new Form2(); f2.m_f1 = this; f2.ShowDialog(); private void button11_Click(object sender, EventArgs e) IntPtr handle = this.Handle; IntPtr h1 = (IntPtr)0, h2 = (IntPtr)0; CLAYUI_OnAnimation(handle, 0, 0, 9, 0); Form2 f2 = new Form2(); f2.m_f1 = this; f2.ShowDialog(); private void button12_Click(object sender, EventArgs e) IntPtr handle = this.Handle; IntPtr h1 = (IntPtr)0, h2 = (IntPtr)0; CLAYUI_OnAnimation(handle, 0, 0, 10, 0); Form2 f2 = new Form2(); f2.m_f1 = this; f2.ShowDialog(); private void button13_Click(object sender, EventArgs e) IntPtr handle = this.Handle; IntPtr h1 = (IntPtr)0, h2 = (IntPtr)0; CLAYUI_OnAnimation(handle, 0, 0, 11, 0); Form2 f2 = new Form2(); f2.m_f1 = this; f2.ShowDialog(); private void button14_Click(object sender, EventArgs e) IntPtr handle = this.Handle; IntPtr h1 = (IntPtr)0, h2 = (IntPtr)0; CLAYUI_OnAnimation(handle, 0, 0, 12, 0); Form2 f2 = new Form2(); f2.m_f1 = this; f2.ShowDialog();
Form2
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace WindowsApplication1 public partial class Form2 : Form public Form1 m_f1; int m_isredraw = 1; public Form2() InitializeComponent(); private void Form2_Load(object sender, EventArgs e) IntPtr handle = this.Handle; Form1.MakeWindowTpt(handle, 0); m_isredraw = 0; private void Form2_Shown(object sender, EventArgs e) IntPtr handle = this.Handle; IntPtr handle1 = m_f1.Handle; Form1.CLAYUI_InitDialog2(handle, handle1); foreach (System.Windows.Forms.Control control in this.Controls) Form1.WinRedraw(control.Handle, 0); timer1.Start(); protected override void OnPaint(PaintEventArgs e) IntPtr handle = this.Handle; if (m_isredraw == 1) base.OnPaint(e); private void timer1_Tick(object sender, EventArgs e) IntPtr handle = this.Handle; if (Form1.IsPlay() == 0) timer1.Stop(); foreach (System.Windows.Forms.Control control in this.Controls) Form1.WinRedraw(control.Handle, 1); Update(); else Form1.Redraw(handle, 1); private void button1_Click(object sender, EventArgs e) IntPtr handle = this.Handle; m_f1.EnableControl(0); m_f1.m_isredraw = 0; Form1.desktomemdc1(handle); Form1.CLAYUI_OnAnimation(handle, 1, 1, 0, 0); m_f1.StartTimer(); Form1.Redraw(m_f1.Handle, 0); Close(); private void button2_Click(object sender, EventArgs e) IntPtr handle = this.Handle; m_f1.EnableControl(0); m_f1.m_isredraw = 0; Form1.desktomemdc1(handle); Form1.CLAYUI_OnAnimation(handle, 1, 2, 1, 0); m_f1.StartTimer(); Form1.Redraw(m_f1.Handle, 0); Close(); private void button3_Click(object sender, EventArgs e) IntPtr handle = this.Handle; m_f1.EnableControl(0); m_f1.m_isredraw = 0; Form1.desktomemdc1(handle); Form1.CLAYUI_OnAnimation(handle, 1, 0, 4, 0); m_f1.StartTimer(); Form1.Redraw(m_f1.Handle, 0); Close(); private void button4_Click(object sender, EventArgs e) IntPtr handle = this.Handle; m_f1.EnableControl(0); m_f1.m_isredraw = 0; Form1.desktomemdc1(handle); Form1.CLAYUI_OnAnimation(handle, 1, 0, 5, 0); m_f1.StartTimer(); Form1.Redraw(m_f1.Handle, 0); Close(); private void button5_Click(object sender, EventArgs e) IntPtr handle = this.Handle; m_f1.EnableControl(0); m_f1.m_isredraw = 0; Form1.desktomemdc1(handle); Form1.CLAYUI_OnAnimation(handle, 1, 0, 2, 0); m_f1.StartTimer(); Form1.Redraw(m_f1.Handle, 0); Close(); private void button6_Click(object sender, EventArgs e) IntPtr handle = this.Handle; m_f1.EnableControl(0); m_f1.m_isredraw = 0; Form1.desktomemdc1(handle); Form1.CLAYUI_OnAnimation(handle, 1, 0, 3, 0); m_f1.StartTimer(); Form1.Redraw(m_f1.Handle, 0); Close(); private void button7_Click(object sender, EventArgs e) IntPtr handle = this.Handle; m_f1.EnableControl(0); m_f1.m_isredraw = 0; Form1.desktomemdc1(handle); Form1.CLAYUI_OnAnimation(handle, 1, 0, 6, 0); m_f1.StartTimer(); Form1.Redraw(m_f1.Handle, 0); Close(); private void button8_Click(object sender, EventArgs e) IntPtr handle = this.Handle; m_f1.EnableControl(0); m_f1.m_isredraw = 0; Form1.desktomemdc1(handle); Form1.CLAYUI_OnAnimation(handle, 1, 0, 7, 0); m_f1.StartTimer(); Form1.Redraw(m_f1.Handle, 0); Close(); private void checkBox1_CheckedChanged(object sender, EventArgs e) private void button9_Click(object sender, EventArgs e) IntPtr handle = this.Handle; m_f1.EnableControl(0); m_f1.m_isredraw = 0; Form1.desktomemdc1(handle); Form1.CLAYUI_OnAnimation(handle, 1, 0, 9, 0); m_f1.StartTimer(); Form1.Redraw(m_f1.Handle, 0); Close(); private void button10_Click(object sender, EventArgs e) IntPtr handle = this.Handle; m_f1.EnableControl(0); m_f1.m_isredraw = 0; Form1.desktomemdc1(handle); Form1.CLAYUI_OnAnimation(handle, 1, 0, 10, 0); m_f1.StartTimer(); Form1.Redraw(m_f1.Handle, 0); Close(); private void button11_Click(object sender, EventArgs e) IntPtr handle = this.Handle; m_f1.EnableControl(0); m_f1.m_isredraw = 0; Form1.desktomemdc1(handle); Form1.CLAYUI_OnAnimation(handle, 1, 0, 11, 0); m_f1.StartTimer(); Form1.Redraw(m_f1.Handle, 0); Close(); private void button12_Click(object sender, EventArgs e) IntPtr handle = this.Handle; m_f1.EnableControl(0); m_f1.m_isredraw = 0; Form1.desktomemdc1(handle); Form1.CLAYUI_OnAnimation(handle, 1, 0, 12, 0); m_f1.StartTimer(); Form1.Redraw(m_f1.Handle, 0); Close();
WinForm磁性窗体的设计
FrmClass.cs View Code 1 using System; 2 using System.Collections.Generic; 3 using System.Text; 4 using System.Windows.Forms;//添加控件及窗体的定名空间 5 using System.Drawing;//添加Point的定名空间 6 using System.Collections;//为ArrayList添加定名空间 7 8 namespace MagnetismForm 9 10 class FrmClass 11 12 #region 磁性窗体-公共变量 13 //记录窗体的隐蔽与显示 14 public static bool Example_ListShow = false; 15 public static bool Example_LibrettoShow = false; 16 public static bool Example_ScreenShow = false; 17 18 //记录鼠标的当前地位 19 public static Point CPoint; //添加定名空间using System.Drawing; 20 public static Point FrmPoint; 21 public static int Example_FSpace = 10;//设置窗体间的间隔 22 23 //Frm_Play窗体的地位及大小 24 public static int Example_Play_Top = 0; 25 public static int Example_Play_Left = 0; 26 public static int Example_Play_Width = 0; 27 public static int Example_Play_Height = 0; 28 public static bool Example_Assistant_AdhereTo = false;//帮助窗体是否磁性在一路 29 30 //Frm_ListBos窗体的地位及大小 31 public static int Example_List_Top = 0; 32 public static int Example_List_Left = 0; 33 public static int Example_List_Width = 0; 34 public static int Example_List_Height = 0; 35 public static bool Example_List_AdhereTo = false;//帮助窗体是否与主窗体磁性在一路 36 37 //Frm_Libretto窗体的地位及大小 38 public static int Example_Libretto_Top = 0; 39 public static int Example_Libretto_Left = 0; 40 public static int Example_Libretto_Width = 0; 41 public static int Example_Libretto_Height = 0; 42 public static bool Example_Libretto_AdhereTo = false;//帮助窗体是否与主窗体磁性在一路 43 44 //窗体之间的间隔差 45 public static int Example_List_space_Top = 0; 46 public static int Example_List_space_Left = 0; 47 public static int Example_Libretto_space_Top = 0; 48 public static int Example_Libretto_space_Left = 0; 49 #endregion 50 51 #region 检测各窗体是否连接在一路 52 /// <summary> 53 /// 检测各窗体是否连接在一路 54 /// </summary> 55 public void FrmBackCheck() 56 57 bool Tem_Magnetism = false; 58 //Frm_ListBos与主窗体 59 Tem_Magnetism = false; 60 if ((Example_Play_Top - Example_List_Top) == 0) 61 Tem_Magnetism = true; 62 if ((Example_Play_Left - Example_List_Left) == 0) 63 Tem_Magnetism = true; 64 if ((Example_Play_Left - Example_List_Left - Example_List_Width) == 0) 65 Tem_Magnetism = true; 66 if ((Example_Play_Left - Example_List_Left + Example_List_Width) == 0) 67 Tem_Magnetism = true; 68 if ((Example_Play_Top - Example_List_Top - Example_List_Height) == 0) 69 Tem_Magnetism = true; 70 if ((Example_Play_Top - Example_List_Top + Example_List_Height) == 0) 71 Tem_Magnetism = true; 72 if (Tem_Magnetism) 73 Example_List_AdhereTo = true; 74 75 //Frm_Libretto与主窗体 76 Tem_Magnetism = false; 77 if ((Example_Play_Top - Example_Libretto_Top) == 0) 78 Tem_Magnetism = true; 79 if ((Example_Play_Left - Example_Libretto_Left) == 0) 80 Tem_Magnetism = true; 81 if ((Example_Play_Left - Example_Libretto_Left - Example_Libretto_Width) == 0) 82 Tem_Magnetism = true; 83 if ((Example_Play_Left - Example_Libretto_Left + Example_Libretto_Width) == 0) 84 Tem_Magnetism = true; 85 if ((Example_Play_Top - Example_Libretto_Top - Example_Libretto_Height) == 0) 86 Tem_Magnetism = true; 87 if ((Example_Play_Top - Example_Libretto_Top + Example_Libretto_Height) == 0) 88 Tem_Magnetism = true; 89 if (Tem_Magnetism) 90 Example_Libretto_AdhereTo = true; 91 92 //两个辅窗体 93 Tem_Magnetism = false; 94 if ((Example_List_Top - Example_Libretto_Top) == 0) 95 Tem_Magnetism = true; 96 if ((Example_List_Left - Example_Libretto_Left) == 0) 97 Tem_Magnetism = true; 98 if ((Example_List_Left - Example_Libretto_Left - Example_Libretto_Width) == 0) 99 Tem_Magnetism = true; 100 if ((Example_List_Left - Example_Libretto_Left + Example_Libretto_Width) == 0) 101 Tem_Magnetism = true; 102 if ((Example_List_Top - Example_Libretto_Top - Example_Libretto_Height) == 0) 103 Tem_Magnetism = true; 104 if ((Example_List_Top - Example_Libretto_Top + Example_Libretto_Height) == 0) 105 Tem_Magnetism = true; 106 if (Tem_Magnetism) 107 Example_Assistant_AdhereTo = true; 108 109 #endregion 110 111 #region 哄骗窗体上的控件移动窗体 112 /// <summary> 113 /// 哄骗控件移动窗体 114 /// </summary> 115 /// <param Frm="Form">窗体</param> 116 /// <param e="MouseEventArgs">控件的移动事务</param> 117 public void FrmMove(Form Frm, MouseEventArgs e) //Form或MouseEventArgs添加定名空间using System.Windows.Forms; 118 119 if (e.Button == MouseButtons.Left) 120 121 Point myPosittion = Control.MousePosition;//获取当前鼠标的屏幕坐标 122 myPosittion.Offset(CPoint.X, CPoint.Y);//重载当前鼠标的地位 123 Frm.DesktopLocation = myPosittion;//设置当前窗体在屏幕上的地位 124 125 126 #endregion 127 128 #region 策画窗体之间的间隔差 129 /// <summary> 130 /// 策画窗体之间的间隔差 131 /// </summary> 132 /// <param Frm="Form">窗体</param> 133 /// <param Follow="Form">跟从窗体</param> 134 public void FrmDistanceJob(Form Frm, Form Follow) 135 136 switch (Follow.Name) 137 138 case "Frm_ListBox": 139 140 Example_List_space_Top = Follow.Top - Frm.Top; 141 Example_List_space_Left = Follow.Left - Frm.Left; 142 break; 143 144 case "Frm_Libretto": 145 146 Example_Libretto_space_Top = Follow.Top - Frm.Top; 147 Example_Libretto_space_Left = Follow.Left - Frm.Left; 148 break; 149 150 151 152 #endregion 153 154 #region 磁性窗体的移动 155 /// <summary> 156 /// 磁性窗体的移动 157 /// </summary> 158 /// <param Frm="Form">窗体</param> 159 /// <param e="MouseEventArgs">控件的移动事务</param> 160 /// <param Follow="Form">跟从窗体</param> 161 public void ManyFrmMove(Form Frm, MouseEventArgs e, Form Follow) //Form或MouseEventArgs添加定名空间using System.Windows.Forms; 162 163 if (e.Button == MouseButtons.Left) 164 165 int Tem_Left = 0; 166 int Tem_Top = 0; 167 Point myPosittion = Control.MousePosition;//获取当前鼠标的屏幕坐标 168 switch (Follow.Name) 169 170 case "Frm_ListBox": 171 172 Tem_Top = Example_List_space_Top - FrmPoint.Y; 173 Tem_Left = Example_List_space_Left - FrmPoint.X; 174 break; 175 176 case "Frm_Libretto": 177 178 Tem_Top = Example_Libretto_space_Top - FrmPoint.Y; 179 Tem_Left = Example_Libretto_space_Left - FrmPoint.X; 180 break; 181 182 183 myPosittion.Offset(Tem_Left, Tem_Top); 184 Follow.DesktopLocation = myPosittion; 185 186 187 #endregion 188 189 #region 对窗体的地位进行初始化 190 /// <summary> 191 /// 对窗体的地位进行初始化 192 /// </summary> 193 /// <param Frm="Form">窗体</param> 194 public void FrmInitialize(Form Frm) 195 196 switch (Frm.Name) 197 198 case "Frm_Play": 199 200 Example_Play_Top = Frm.Top; 201 Example_Play_Left = Frm.Left; 202 Example_Play_Width = Frm.Width; 203 Example_Play_Height = Frm.Height; 204 break; 205 206 case "Frm_ListBox": 207 208 Example_List_Top = Frm.Top; 209 Example_List_Left = Frm.Left; 210 Example_List_Width = Frm.Width; 211 Example_List_Height = Frm.Height; 212 break; 213 214 case "Frm_Libretto": 215 216 Example_Libretto_Top = Frm.Top; 217 Example_Libretto_Left = Frm.Left; 218 Example_Libretto_Width = Frm.Width; 219 Example_Libretto_Height = Frm.Height; 220 break; 221 222 223 224 225 #endregion 226 227 #region 存储各窗体的当前信息 228 /// <summary> 229 /// 存储各窗体的当前信息 230 /// </summary> 231 /// <param Frm="Form">窗体</param> 232 /// <param e="MouseEventArgs">控件的移动事务</param> 233 public void FrmPlace(Form Frm) 234 235 FrmInitialize(Frm); 236 FrmMagnetism(Frm); 237 238 #endregion 239 240 #region 窗体的磁性设置 241 /// <summary> 242 /// 窗体的磁性设置 243 /// </summary> 244 /// <param Frm="Form">窗体</param> 245 public void FrmMagnetism(Form Frm) 246 247 if (Frm.Name != "Frm_Play") 248 249 FrmMagnetismCount(Frm, Example_Play_Top, Example_Play_Left, Example_Play_Width, Example_Play_Height, "Frm_Play"); 250 251 if (Frm.Name != "Frm_ListBos") 252 253 FrmMagnetismCount(Frm, Example_List_Top, Example_List_Left, Example_List_Width, Example_List_Height, "Frm_ListBos"); 254 255 if (Frm.Name != "Frm_Libratto") 256 257 FrmMagnetismCount(Frm, Example_Libretto_Top, Example_Libretto_Left, Example_Libretto_Width, Example_Libretto_Height, "Frm_Libratto"); 258 259 FrmInitialize(Frm); 260 261 #endregion 262 263 #region 磁性窗体的策画 264 /// <summary> 265 /// 磁性窗体的策画 266 /// </summary> 267 /// <param Frm="Form">窗体</param> 268 /// <param e="MouseEventArgs">控件的移动事务</param> 269 public void FrmMagnetismCount(Form Frm, int top, int left, int width, int height, string Mforms) 270 271 bool Tem_Magnetism = false;//断定是否有磁性产生 272 string Tem_MainForm = "";//姑且记录主窗体 273 string Tem_AssistForm = "";//姑且记录辅窗体 274 275 //上方进行磁性窗体 276 if ((Frm.Top + Frm.Height - top) <= Example_FSpace && (Frm.Top + Frm.Height - top) >= -Example_FSpace) 277 278 //当一个主窗体不包含辅窗体时 279 if ((Frm.Left >= left && Frm.Left <= (left + width)) || ((Frm.Left + Frm.Width) >= left && (Frm.Left + Frm.Width) <= (left + width))) 280 281 Frm.Top = top - Frm.Height; 282 if ((Frm.Left - left) <= Example_FSpace && (Frm.Left - left) >= -Example_FSpace) 283 Frm.Left = left; 284 Tem_Magnetism = true; 285 286 //当一个主窗体包含辅窗体时 287 if (Frm.Left <= left && (Frm.Left + Frm.Width) >= (left + width)) 288 289 Frm.Top = top - Frm.Height; 290 if ((Frm.Left - left) <= Example_FSpace && (Frm.Left - left) >= -Example_FSpace) 291 Frm.Left = left; 292 Tem_Magnetism = true; 293 294 295 296 297 //下面进行磁性窗体 298 if ((Frm.Top - (top + height)) <= Example_FSpace && (Frm.Top - (top + height)) >= -Example_FSpace) 299 300 //当一个主窗体不包含辅窗体时 301 if ((Frm.Left >= left && Frm.Left <= (left + width)) || ((Frm.Left + Frm.Width) >= left && (Frm.Left + Frm.Width) <= (left + width))) 302 303 Frm.Top = top + height; 304 if ((Frm.Left - left) <= Example_FSpace && (Frm.Left - left) >= -Example_FSpace) 305 Frm.Left = left; 306 Tem_Magnetism = true; 307 308 //当一个主窗体包含辅窗体时 309 if (Frm.Left <= left && (Frm.Left + Frm.Width) >= (left + width)) 310 311 Frm.Top = top + height; 312 if ((Frm.Left - left) <= Example_FSpace && (Frm.Left - left) >= -Example_FSpace) 313 Frm.Left = left; 314 Tem_Magnetism = true; 315 316 317 318 //左面进行磁性窗体 319 if ((Frm.Left + Frm.Width - left) <= Example_FSpace && (Frm.Left + Frm.Width - left) >= -Example_FSpace) 320 321 //当一个主窗体不包含辅窗体时 322 if ((Frm.Top > top && Frm.Top <= (top + height)) || ((Frm.Top + Frm.Height) >= top && (Frm.Top + Frm.Height) <= (top + height))) 323 324 Frm.Left = left - Frm.Width; 325 if ((Frm.Top - top) <= Example_FSpace && (Frm.Top - top) >= -Example_FSpace) 326 Frm.Top = top; 327 Tem_Magnetism = true; 328 329 //当一个主窗体包含辅窗体时 330 if (Frm.Top <= top && (Frm.Top + Frm.Height) >= (top + height)) 331 332 Frm.Left = left - Frm.Width; 333 if ((Frm.Top - top) <= Example_FSpace && (Frm.Top - top) >= -Example_FSpace) 334 Frm.Top = top; 335 Tem_Magnetism = true; 336 337 338 339 //右面进行磁性窗体 340 if ((Frm.Left - (left + width)) <= Example_FSpace && (Frm.Left - (left + width)) >= -Example_FSpace) 341 342 //当一个主窗体不包含辅窗体时 343 if ((Frm.Top > top && Frm.Top <= (top + height)) || ((Frm.Top + Frm.Height) >= top && (Frm.Top + Frm.Height) <= (top + height))) 344 345 Frm.Left = left + width; 346 if ((Frm.Top - top) <= Example_FSpace && (Frm.Top - top) >= -Example_FSpace) 347 Frm.Top = top; 348 Tem_Magnetism = true; 349 350 //当一个主窗体包含辅窗体时 351 if (Frm.Top <= top && (Frm.Top + Frm.Height) >= (top + height)) 352 353 Frm.Left = left + width; 354 if ((Frm.Top - top) <= Example_FSpace && (Frm.Top - top) >= -Example_FSpace) 355 Frm.Top = top; 356 Tem_Magnetism = true; 357 358 359 if (Frm.Name == "Frm_Play") 360 Tem_MainForm = "Frm_Play"; 361 else 362 Tem_AssistForm = Frm.Name; 363 if (Mforms == "Frm_Play") 364 Tem_MainForm = "Frm_Play"; 365 else 366 Tem_AssistForm = Mforms; 367 if (Tem_MainForm == "") 368 369 Example_Assistant_AdhereTo = Tem_Magnetism; 370 371 else 372 373 switch (Tem_AssistForm) 374 375 case "Frm_ListBos": 376 Example_List_AdhereTo = Tem_Magnetism; 377 break; 378 case "Frm_Libratto": 379 Example_Libretto_AdhereTo = Tem_Magnetism; 380 break; 381 382 383 384 #endregion 385 386 #region 恢复窗体的初始大小 387 /// <summary> 388 /// 恢复窗体的初始大小(当松开鼠标时,若是窗体的大小小于300*200,恢复初始状况) 389 /// </summary> 390 /// <param Frm="Form">窗体</param> 391 public void FrmScreen_FormerlySize(Form Frm, int PWidth, int PHeight) 392 393 if (Frm.Width < PWidth || Frm.Height < PHeight) 394 395 Frm.Width = PWidth; 396 Frm.Height = PHeight; 397 //Example_Size = false; 398 399 400 #endregion 401 402 403 Frm_Play.cs View Code 1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Linq; 7 using System.Text; 8 using System.Windows.Forms; 9 10 namespace MagnetismForm 11 12 public partial class Frm_Play : Form 13 14 public Frm_Play() 15 16 InitializeComponent(); 17 18 19 #region 公共变量 20 FrmClass Cla_FrmClass = new FrmClass(); 21 public static Form F_List = new Form(); 22 public static Form F_Libretto = new Form(); 23 public static Form F_Screen = new Form(); 24 #endregion 25 26 private void Frm_Play_Load(object sender, EventArgs e) 27 28 //窗体地位的初始化 29 Cla_FrmClass.FrmInitialize(this); 30 31 32 private void panel_Title_MouseDown(object sender, MouseEventArgs e) 33 34 35 int Tem_Y = 0; 36 if (e.Button == MouseButtons.Left)//按下的是否为鼠标左键 37 38 Cla_FrmClass.FrmBackCheck();//检测各窗体是否连在一路 39 Tem_Y = e.Y; 40 FrmClass.FrmPoint = new Point(e.X, Tem_Y);//获取鼠标在窗体上的地位,用于磁性窗体 41 FrmClass.CPoint = new Point(-e.X, -Tem_Y);//获取鼠标在屏幕上的地位,用于窗体的移动 42 if (FrmClass.Example_List_AdhereTo)//若是与frm_ListBox窗体相连接 43 44 Cla_FrmClass.FrmDistanceJob(this, F_List);//策画窗体的间隔差 45 if (FrmClass.Example_Assistant_AdhereTo)//两个辅窗体是否连接在一路 46 47 Cla_FrmClass.FrmDistanceJob(this, F_Libretto);//策画窗体的间隔差 48 49 50 if (FrmClass.Example_Libretto_AdhereTo)//若是与frm_Libretto窗体相连接 51 52 Cla_FrmClass.FrmDistanceJob(this, F_Libretto);//策画窗体的间隔差 53 if (FrmClass.Example_Assistant_AdhereTo)//两个辅窗体是否连接在一路 54 55 Cla_FrmClass.FrmDistanceJob(this, F_List);//策画窗体的间隔差 56 57 58 59 60 61 62 private void panel_Title_MouseMove(object sender, MouseEventArgs e) 63 64 if (e.Button == MouseButtons.Left)//按下的是否为鼠标左键 65 66 67 Cla_FrmClass.FrmMove(this, e);//哄骗控件移动窗体 68 if (FrmClass.Example_List_AdhereTo)//若是frm_ListBox窗体与主窗体连接 69 70 71 Cla_FrmClass.ManyFrmMove(this, e, F_List);//磁性窗体的移动 72 Cla_FrmClass.FrmInitialize(F_List);//对frm_ListBox窗体的地位进行初始化 73 if (FrmClass.Example_Assistant_AdhereTo)//若是两个子窗体连接在一路 74 75 Cla_FrmClass.ManyFrmMove(this, e, F_Libretto); 76 Cla_FrmClass.FrmInitialize(F_Libretto); 77 78 79 80 if (FrmClass.Example_Libretto_AdhereTo)//若是frm_Libretto窗体与主窗体连接 81 82 Cla_FrmClass.ManyFrmMove(this, e, F_Libretto); 83 Cla_FrmClass.FrmInitialize(F_Libretto); 84 if (FrmClass.Example_Assistant_AdhereTo) 85 86 Cla_FrmClass.ManyFrmMove(this, e, F_List); 87 Cla_FrmClass.FrmInitialize(F_List); 88 89 90 Cla_FrmClass.FrmInitialize(this); 91 92 93 94 private void panel_Title_MouseUp(object sender, MouseEventArgs e) 95 96 Cla_FrmClass.FrmPlace(this); 97 98 99 private void Frm_Play_Shown(object sender, EventArgs e) 100 101 //显示列表窗体 102 F_List = new Frm_ListBox(); 103 F_List.ShowInTaskbar = false; 104 FrmClass.Example_ListShow = true; 105 F_List.Show(); 106 //显示歌词窗体 107 F_Libretto = new Frm_Libretto(); 108 F_Libretto.ShowInTaskbar = false; 109 FrmClass.Example_LibrettoShow = true; 110 F_Libretto.Show(); 111 F_Libretto.Left = this.Left + this.Width; 112 F_Libretto.Top = this.Top; 113 //各窗体地位的初始化 114 Cla_FrmClass.FrmInitialize(F_List); 115 Cla_FrmClass.FrmInitialize(F_Libretto); 116 117 118 private void panel_Close_Click(object sender, EventArgs e) 119 120 F_List.Close(); 121 F_List.Dispose(); 122 F_Libretto.Close(); 123 F_Libretto.Dispose(); 124 F_Screen.Close(); 125 F_Screen.Dispose(); 126 this.Close(); 127 128 129 private void panel_Title_Click(object sender, EventArgs e) 130 131 F_List.Focus(); 132 F_Libretto.Focus(); 133 this.Focus(); 134 135 136 137 138 Frm_Play.designer.cs View Code 1 namespace MagnetismForm 2 3 partial class Frm_Play 4 5 /// <summary> 6 /// 必须的设计器变量。 7 /// </summary> 8 private System.ComponentModel.IContainer components = null; 9 10 /// <summary> 11 /// 清理所有正在应用的资料。 12 /// </summary> 13 /// <param name="disposing">若是应开释托管资料,为 true;不然为 false。</param> 14 protected override void Dispose(bool disposing) 15 16 if (disposing && (components != null)) 17 18 components.Dispose(); 19 20 base.Dispose(disposing); 21 22 23 #region Windows 窗体设计器生成的代码 24 25 /// <summary> 26 /// 设计器支撑所需的办法 - 不要 27 /// 应用代码编辑器批改此办法的内容。 28 /// </summary> 29 private void InitializeComponent() 30 31 this.panel_Title = new System.Windows.Forms.Panel(); 32 this.panel_Close = new System.Windows.Forms.Panel(); 33 this.pictureBox1 = new System.Windows.Forms.PictureBox(); 34 this.panel_Title.SuspendLayout(); 35 ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); 36 this.SuspendLayout(); 37 // 38 // panel_Title 39 // 40 this.panel_Title.BackColor = System.Drawing.Color.MediumBlue; 41 this.panel_Title.BackgroundImage = global::MagnetismForm.Properties.Resources._1; 42 this.panel_Title.Controls.Add(this.panel_Close); 43 this.panel_Title.Dock = System.Windows.Forms.DockStyle.Top; 44 this.panel_Title.Location = new System.Drawing.Point(0, 0); 45 this.panel_Title.Name = "panel_Title"; 46 this.panel_Title.Size = new System.Drawing.Size(290, 31); 47 this.panel_Title.TabIndex = 0; 48 this.panel_Title.MouseMove += new System.Windows.Forms.MouseEventHandler(this.panel_Title_MouseMove); 49 this.panel_Title.Click += new System.EventHandler(this.panel_Title_Click); 50 this.panel_Title.MouseDown += new System.Windows.Forms.MouseEventHandler(this.panel_Title_MouseDown); 51 this.panel_Title.MouseUp += new System.Windows.Forms.MouseEventHandler(this.panel_Title_MouseUp); 52 // 53 // panel_Close 54 // 55 this.panel_Close.BackColor = System.Drawing.Color.Red; 56 this.panel_Close.BackgroundImage = global::MagnetismForm.Properties.Resources.Close; 57 this.panel_Close.Location = new System.Drawing.Point(270, 5); 58 this.panel_Close.Name = "panel_Close"; 59 this.panel_Close.Size = new System.Drawing.Size(18, 18); 60 this.panel_Close.TabIndex = 0; 61 this.panel_Close.Click += new System.EventHandler(this.panel_Close_Click); 62 // 63 // pictureBox1 64 // 65 this.pictureBox1.Image = global::MagnetismForm.Properties.Resources._4; 66 this.pictureBox1.Location = new System.Drawing.Point(0, 31); 67 this.pictureBox1.Name = "pictureBox1"; 68 this.pictureBox1.Size = new System.Drawing.Size(290, 89); 69 this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; 70 this.pictureBox1.TabIndex = 1; 71 this.pictureBox1.TabStop = false; 72 // 73 // Frm_Play 74 // 75 this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); 76 this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 77 this.ClientSize = new System.Drawing.Size(290, 120); 78 this.Controls.Add(this.pictureBox1); 79 this.Controls.Add(this.panel_Title); 80 this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; 81 this.Name = "Frm_Play"; 82 this.Text = "主窗体"; 83 this.Load += new System.EventHandler(this.Frm_Play_Load); 84 this.Shown += new System.EventHandler(this.Frm_Play_Shown); 85 this.panel_Title.ResumeLayout(false); 86 ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); 87 this.ResumeLayout(false); 88 89 90 91 #endregion 92 93 private System.Windows.Forms.Panel panel_Title; 94 private System.Windows.Forms.Panel panel_Close; 95 private System.Windows.Forms.PictureBox pictureBox1; 96 97 Frm_ListBox.cs View Code 1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Linq; 7 using System.Text; 8 using System.Windows.Forms; 9 10 namespace MagnetismForm 11 12 public partial class Frm_ListBox : Form 13 14 public Frm_ListBox() 15 16 InitializeComponent(); 17 18 19 #region 公共变量 20 FrmClass Cla_FrmClass = new FrmClass(); 21 #endregion 22 23 private void Frm_ListBox_Load(object sender, EventArgs e) 24 25 this.Left = FrmClass.Example_Play_Left; 26 this.Top = FrmClass.Example_Play_Top + FrmClass.Example_Play_Height; 27 Cla_FrmClass.FrmInitialize(this); 28 29 30 private void panel_Title_MouseDown(object sender, MouseEventArgs e) 31 32 FrmClass.CPoint = new Point(-e.X, -e.Y); 33 34 35 private void panel_Title_MouseMove(object sender, MouseEventArgs e) 36 37 FrmClass.Example_Assistant_AdhereTo = false; 38 FrmClass.Example_List_AdhereTo = false; 39 Cla_FrmClass.FrmMove(this, e); 40 41 42 private void panel_Title_MouseUp(object sender, MouseEventArgs e) 43 44 Cla_FrmClass.FrmPlace(this); 45 46 47 Frm_ListBox.designer.cs View Code 1 namespace MagnetismForm 2 3 partial class Frm_ListBox 4 5 /// <summary> 6 /// Required designer variable. 7 /// </summary> 8 private System.ComponentModel.IContainer components = null; 9 10 /// <summary> 11 /// Clean up any resources being used. 12 /// </summary> 13 /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> 14 protected override void Dispose(bool disposing) 15 16 if (disposing && (components != null)) 17 18 components.Dispose(); 19 20 base.Dispose(disposing); 21 22 23 #region Windows Form Designer generated code 24 25 /// <summary> 26 /// Required method for Designer support - do not modify 27 /// the contents of this method with the code editor. 28 /// </summary> 29 private void InitializeComponent() 30 31 this.pictureBox1 = new System.Windows.Forms.PictureBox(); 32 this.panel_Title = new System.Windows.Forms.Panel(); 33 ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); 34 this.SuspendLayout(); 35 // 36 // pictureBox1 37 // 38 this.pictureBox1.Image = global::MagnetismForm.Properties.Resources._4; 39 this.pictureBox1.Location = new System.Drawing.Point(0, 31); 40 this.pictureBox1.Name = "pictureBox1"; 41 this.pictureBox1.Size = new System.Drawing.Size(290, 89); 42 this.pictureBox1.TabIndex = 1; 43 this.pictureBox1.TabStop = false; 44 // 45 // panel_Title 46 // 47 this.panel_Title.BackColor = System.Drawing.Color.MediumBlue; 48 this.panel_Title.BackgroundImage = global::MagnetismForm.Properties.Resources._5; 49 this.panel_Title.Dock = System.Windows.Forms.DockStyle.Top; 50 this.panel_Title.Location = new System.Drawing.Point(0, 0); 51 this.panel_Title.Name = "panel_Title"; 52 this.panel_Title.Size = new System.Drawing.Size(290, 31); 53 this.panel_Title.TabIndex = 0; 54 this.panel_Title.MouseMove += new System.Windows.Forms.MouseEventHandler(this.panel_Title_MouseMove); 55 this.panel_Title.MouseDown += new System.Windows.Forms.MouseEventHandler(this.panel_Title_MouseDown); 56 this.panel_Title.MouseUp += new System.Windows.Forms.MouseEventHandler(this.panel_Title_MouseUp); 57 // 58 // Frm_ListBox 59 // 60 this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); 61 this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 62 this.ClientSize = new System.Drawing.Size(290, 120); 63 this.Controls.Add(this.pictureBox1); 64 this.Controls.Add(this.panel_Title); 65 this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; 66 this.Name = "Frm_ListBox"; 67 this.Text = "辅窗体1"; 68 this.Load += new System.EventHandler(this.Frm_ListBox_Load); 69 ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); 70 this.ResumeLayout(false); 71 72 73 74 #endregion 75 76 private System.Windows.Forms.Panel panel_Title; 77 private System.Windows.Forms.PictureBox pictureBox1; 78 79 Frm_Libretto.cs View Code 1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Linq; 7 using System.Text; 8 using System.Windows.Forms; 9 10 namespace MagnetismForm 11 12 public partial class Frm_Libretto : Form 13 14 public Frm_Libretto() 15 16 InitializeComponent(); 17 18 19 #region 公共变量 20 FrmClass Cla_FrmClass = new FrmClass(); 21 #endregion 22 23 private void Frm_Libretto_Load(object sender, EventArgs e) 24 25 this.Top = FrmClass.Example_Play_Top; 26 this.Left = FrmClass.Example_Play_Left + FrmClass.Example_Play_Width; 27 Cla_FrmClass.FrmInitialize(this); 28 29 30 private void panel_Title_MouseDown(object sender, MouseEventArgs e) 31 32 FrmClass.CPoint = new Point(-e.X, -e.Y); 33 34 35 private void panel_Title_MouseMove(object sender, MouseEventArgs e) 36 37 FrmClass.Example_Assistant_AdhereTo = false; 38 FrmClass.Example_Libretto_AdhereTo = false; 39 Cla_FrmClass.FrmMove(this, e); 40 41 42 private void panel_Title_MouseUp(object sender, MouseEventArgs e) 43 44 Cla_FrmClass.FrmPlace(this); 45 46 47 Frm_Libretto.designer.cs View Code 1 namespace MagnetismForm 2 3 partial class Frm_Libretto 4 5 /// <summary> 6 /// Required designer variable. 7 /// </summary> 8 private System.ComponentModel.IContainer components = null; 9 10 /// <summary> 11 /// Clean up any resources being used. 12 /// </summary> 13 /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> 14 protected override void Dispose(bool disposing) 15 16 if (disposing && (components != null)) 17 18 components.Dispose(); 19 20 base.Dispose(disposing); 21 22 23 #region Windows Form Designer generated code 24 25 /// <summary> 26 /// Required method for Designer support - do not modify 27 /// the contents of this method with the code editor. 28 /// </summary> 29 private void InitializeComponent() 30 31 this.pictureBox1 = new System.Windows.Forms.PictureBox(); 32 this.panel_Title = new System.Windows.Forms.Panel(); 33 ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); 34 this.SuspendLayout(); 35 // 36 // pictureBox1 37 // 38 this.pictureBox1.Image = global::MagnetismForm.Properties.Resources._2; 39 this.pictureBox1.Location = new System.Drawing.Point(0, 31); 40 this.pictureBox1.Name = "pictureBox1"; 41 this.pictureBox1.Size = new System.Drawing.Size(290, 209); 42 this.pictureBox1.TabIndex = 1; 43 this.pictureBox1.TabStop = false; 44 // 45 // panel_Title 46 // 47 this.panel_Title.BackColor = System.Drawing.Color.MediumBlue; 48 this.panel_Title.BackgroundImage = global::MagnetismForm.Properties.Resources._5; 49 this.panel_Title.Dock = System.Windows.Forms.DockStyle.Top; 50 this.panel_Title.Location = new System.Drawing.Point(0, 0); 51 this.panel_Title.Name = "panel_Title"; 52 this.panel_Title.Size = new System.Drawing.Size(290, 31); 53 this.panel_Title.TabIndex = 0; 54 this.panel_Title.MouseMove += new System.Windows.Forms.MouseEventHandler(this.panel_Title_MouseMove); 55 this.panel_Title.MouseDown += new System.Windows.Forms.MouseEventHandler(this.panel_Title_MouseDown); 56 this.panel_Title.MouseUp += new System.Windows.Forms.MouseEventHandler(this.panel_Title_MouseUp); 57 // 58 // Frm_Libretto 59 // 60 this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); 61 this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 62 this.ClientSize = new System.Drawing.Size(290, 240); 63 this.Controls.Add(this.pictureBox1); 64 this.Controls.Add(this.panel_Title); 65 this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; 66 this.Name = "Frm_Libretto"; 67 this.Text = "Frm_Libretto"; 68 this.Load += new System.EventHandler(this.Frm_Libretto_Load); 69 ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); 70 this.ResumeLayout(false); 71 72 73 74 #endregion 75 76 private System.Windows.Forms.Panel panel_Title; 77 private System.Windows.Forms.PictureBox pictureBox1; 78 79
比如qq那样,拖到桌面边上,它会自动吸附在桌面边上,并且还会自动伸缩,(和windows的任务栏也类似)
比如qq那样,拖到桌面边上,它会自动吸附在桌面边上,并且还会自动伸缩,(和windows的任务栏也类似) 两个窗口之间的吸附作用我也想了解,有谁知道怎么实现的是?? 怎样建立磁性窗体(转贴于: :《程序员》2002年第01期) 实现磁性窗体基本上分为两步,第一步是实现当两个窗体靠近到一定距离以内时实现窗体间的粘贴操作,第二步是一定窗体时,同时移动与它粘在一起的其它窗体。 实现窗体的粘贴 实现粘贴的难点在于什么时候进行这个操作,假设有两个窗体Form1和Form2,移动Form2向Form1靠近,当Form2与Form1的最近距离小于distance时粘贴在一起。显然,应该在移动Form2的过程中进行判断,问题是在程序的什么位置插入判断代码呢? 合理的方法是利用系统产生的消息,但是利用什么消息呢?窗体在移动时会产生WM_WINDOWPOSCHANGING和WM_MOVING消息,移动结束后会产生WM_WINDOWPOSCHANGED和WM_MOVE消息。WM_WINDOWPOSCHANGING和WM_WINDOWPOSCHANGED消息的参数lParam是结构WINDOWPOS的指针,WINDOWPOS定义如下: typedef struct _WINDOWPOS HWND hwnd; // 窗口句炳 HWND hwndInsertAfter; // 窗口的Z顺序 int x; // 窗口x坐标 int y; // 窗口的y坐标 int cx; // 窗口的宽度 int cy; // 窗口的高度 UINT flags; // 标志位,根据它设定窗口的位置 WINDOWPOS; 可以看出,WM_WINDOWPOSCHANGED消息不仅仅在窗口移动时产生,而且在它的Z顺序发生变化时产生,包括窗口的显示和隐藏。所以我认为这个消息不是最佳选择。 WM_MOVING和WM_MOVE消息的参数lParam是一个RECT结构指针,与WM_WINDOWPOSCHANGED消息相比较为单纯,我采用的即是这个消息。 ----------------------------- 用 "磁性窗体 ",到google找,很多. 有了以上的东西,用C# 的unsafe code ,调用API,不难实现. ■■■■■ To teach a fish how to swim. ■■■■■
简单的磁性窗体源程序
最近在写一个小程序,顺便添加了一个磁性窗体功能。很简单,我却折腾了半天,现在把源代码奉献出来,供大家参考,不足之处希望指出。 //全局变量: private bool mouseDown = false; //鼠标是否按下 private Point mouseLocation; //鼠标位置 //鼠标移动事件 private void frmMain_MouseMove(object sender, MouseEventArgs e) ... bool move = true; //是否根据移动窗体 Point p1 = this.Location; //获得当前窗体坐标 if (mouseDown ==true) //检测鼠标是否按下 ... p1.Offset(e.Location.X - mouseLocation.X, e.Location.Y - mouseLocation.Y); //将p1按照鼠标移动偏移 if (Location.X <= 20 && e.Location.X - mouseLocation.X<=20) //判断当前窗体横坐标是否小于指定吸附距离,并且鼠标横位移是否小于此距离(注意:鼠标的位移一定要等于或大于指定距离,否则窗体会产生晃动) ... move = false; //此时鼠标移动不会移动窗体 if (!move) //检测此时是否由鼠标控制窗体 p1.X = 0; //将窗体吸附到边缘 if (Location.Y <= 20 && e.Location.Y - mouseLocation.Y<=20) //检测纵坐标(其他同上) ... move = false; if (!move) p1.Y = 0; this.Location = p1; //设置窗体位置为改变后的坐标 //鼠标按下事件 private void frmMain_MouseDown(object sender, MouseEventArgs e) ... if (e.Button == MouseButtons.Left) //判断是否按下鼠标左键 ... mouseDown = true; mouseLocation = e.Location; //获得此时的鼠标位置 //鼠标松开事件 private void frmMain_MouseUp(object sender, MouseEventArgs e) ... mouseDown = false;
今天编程的时候,遇到一个问题:在同一个窗体区域加载两个不同的窗体,每次只显示一个子窗体并能够对这两个子窗体做切换。
今天编程的时候,遇到一个问题:在同一个窗体区域加载两个不同的窗体,每次只显示一个子窗体并能够对这两个子窗体做切换。 对于这个问题用panel控件是非常简单的,只要每次清空panel控件上的子窗体,然后加载另一个子窗体即可。代码如下所示: panel1.Clear(); // 清空的是当前panel上的子窗体 panel1.Add(subtabcontrol);//subtabcontrol是另一个子窗体
两个问题
两个问题 1、当切换两窗体的焦点时,子窗体的Location属性为什么会发生变化? 2、当最小化主窗体后,再恢复主窗体,子窗体却出不来了? 主窗体的代码如下 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace formlink public partial class Form1 : Form private Form2 f2; private bool Islink; private Point p; private int DeviationX, DeviationY; public Form1() InitializeComponent(); f2 = null; Islink = true; private void Form1_Load(object sender, EventArgs e) textBox1.Text = this.Location.X.ToString(); textBox2.Text = this.Location.Y.ToString(); textBox3.Text = this.Size.Width.ToString(); textBox4.Text = this.Size.Height.ToString(); private void button1_Click(object sender, EventArgs e) if (f2 == null) Form2 fm2 = new Form2(this); fm2.Show(); else label5.Text = f2.Visible.ToString();//判断子窗体的visible属性 private void Form1_LocationChanged(object sender, EventArgs e) textBox1.Text = this.Location.X.ToString(); textBox2.Text = this.Location.Y.ToString(); if (f2 != null) if (Islink == true)//如果两窗体相连,子窗体跟随主窗体一起移动 f2.Set_Form2_Location(DeviationX, DeviationY); else f2.Set_Form2_NewLocation();//吸引子窗体 public void Set_Form2(Form2 ptf2) f2 = ptf2; this.Set_Deviation(); public void Set_Islink(bool ptlink) Islink = ptlink; private void Form1_Activated(object sender, EventArgs e) this.Set_Deviation(); public void Set_Deviation() if (f2 != null) DeviationX = f2.Location.X - this.Location.X; DeviationY = f2.Location.Y - this.Location.Y; · 对我有用[0]· 丢个板砖[0]· 引用· 举报· 管理· TOP精华推荐:如何让gridview中的checkbox根据数据库情况默认选中? 子窗体的代码如下,下帖还有using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;namespace formlink public partial class Form2 : Form private Form1 f1; private Point MouseDownLocation, MouseStartDrag; private bool bLeft, bRight, bTop, bBottom, IsLink; private bool bTopLeft, bTopRight, bBottomLeft, bBottomRight; public Form2(Form1 ptf1) InitializeComponent(); f1 = ptf1; private void Form2_Load(object sender, EventArgs e) textBox3.Text = this.Size.Width.ToString(); textBox4.Text = this.Size.Height.ToString(); this.Location = new Point(f1.Location.X + f1.Size.Width, f1.Location.Y); f1.Set_Form2(this); private void Form2_FormClosed(object sender, FormClosedEventArgs e) f1.Set_Form2(null); public void Set_Form2_Location(int ptDeviationX,int ptDeviationY) this.Location = new Point(f1.Location.X + ptDeviationX, f1.Location.Y + ptDeviationY); private void button1_Click(object sender, EventArgs e) this.Close(); · · wangtong2010· (wangtong2010)· 等 级:· #5楼 得分:0回复于:2010-07-11 11:02:43 private void Form2_MouseDown(object sender, MouseEventArgs e) if (e.Button == MouseButtons.Left) MouseDownLocation = new Point(e.X, e.Y);//获取鼠标按下时的位置 MouseStartDrag = Control.MousePosition;//当开始拖拽鼠标时的位置 private void Form2_LocationChanged(object sender, EventArgs e) textBox1.Text = this.Location.X.ToString(); textBox2.Text = this.Location.Y.ToString(); textBox3.Text = this.Size.Width.ToString(); textBox4.Text = this.Size.Height.ToString(); bLeft = this.Location.X + this.Size.Width == f1.Location.X && this.Location.Y + this.Size.Height > f1.Location.Y && this.Location.Y < f1.Location.Y + f1.Size.Height; //判断是否左侧相连 bRight = this.Location.X == f1.Location.X + f1.Size.Width && this.Location.Y + this.Size.Height > f1.Location.Y && this.Location.Y < f1.Location.Y + f1.Size.Height; //判断是否右侧相连 bTop = this.Location.Y + this.Size.Height == f1.Location.Y && this.Location.X + this.Size.Width > f1.Location.X && this.Location.X < f1.Location.X + f1.Size.Width; //判断是否上侧相连 bBottom = this.Location.Y == f1.Location.Y + f1.Size.Height && this.Location.X + this.Size.Width > f1.Location.X && this.Location.X < f1.Location.X + f1.Size.Width; //判断是否下侧相连 bTopLeft = this.Location.X + this.Size.Width == f1.Location.X && this.Location.Y + this.Size.Height == f1.Location.Y; //判断是否左上角相连 bTopRight = this.Location.X == f1.Location.X + f1.Size.Width && this.Location.Y + this.Size.Height == f1.Location.Y; //判断是否右上角相连 bBottomLeft = this.Location.X + this.Size.Width == f1.Location.X && this.Location.Y == f1.Location.Y + f1.Size.Height; //判断是否左下角相连 bBottomRight = this.Location.X == f1.Location.X + f1.Size.Width && this.Location.Y == f1.Location.Y + f1.Size.Height; //判断是否右下角相连 IsLink = bLeft || bRight || bTop || bBottom || bTopLeft || bTopRight || bBottomLeft || bBottomRight; //判断是否相连 f1.Set_Islink(IsLink); //改变主窗体的连接信息 private void Form2_MouseMove(object sender, MouseEventArgs e) if (e.Button == MouseButtons.Left) Point p; p = Control.MousePosition;//获取当前鼠标桌面位置 if (IsLink == true)//如果当前两个窗体连接上了 if (bLeft == true)//子窗体连在主窗体左侧 if (MouseStartDrag.X - p.X >= 20)//当拖拽量大于等于20时,两窗体分离 this.Location = new Point(this.Location.X - 20, p.Y - MouseDownLocation.Y); else//否则子窗体沿主窗体边沿滑动 this.Location = new Point(this.Location.X, p.Y - MouseDownLocation.Y); else if (bRight == true)//子窗体连在主窗体右侧 if (p.X - MouseStartDrag.X >= 20) this.Location = new Point(this.Location.X + 20, p.Y - MouseDownLocation.Y); else this.Location = new Point(this.Location.X, p.Y - MouseDownLocation.Y); else if (bTop == true)//子窗体连在主窗体上侧 if (MouseStartDrag.Y - p.Y >= 20) this.Location = new Point(p.X - MouseDownLocation.X, this.Location.Y - 20); else this.Location = new Point(p.X - MouseDownLocation.X, this.Location.Y); else if (bBottom == true)//子窗体连在主窗体下侧 if (p.Y - MouseStartDrag.Y >= 20) this.Location = new Point(p.X - MouseDownLocation.X, this.Location.Y + 20); else this.Location = new Point(p.X - MouseDownLocation.X, this.Location.Y); else if (bTopLeft == true)//子窗体连在主窗体左上角 if (p.X - MouseStartDrag.X <= -20 || p.Y - MouseStartDrag.Y <= -20)//当拖拽的方向向远离主窗体并超过20时,两窗体分离 this.Location = new Point(p.X - MouseDownLocation.X, p.Y - MouseDownLocation.Y); else if (p.X - MouseStartDrag.X > 0 && p.Y - MouseStartDrag.Y <= 0)//否则子窗体滑向主窗体的一边沿 this.Location = new Point(p.X - MouseDownLocation.X, this.Location.Y); else if (p.Y - MouseStartDrag.Y > 0 && p.X - MouseStartDrag.X <= 0)//否则子窗体滑向主窗体的一边沿 this.Location = new Point(this.Location.X, p.Y - MouseDownLocation.Y); else if (bTopRight == true)//子窗体连在主窗体右上角 if (p.X - MouseStartDrag.X >= 20 || p.Y - MouseStartDrag.Y <= -20) this.Location = new Point(p.X - MouseDownLocation.X, p.Y - MouseDownLocation.Y); else if (p.X - MouseStartDrag.X < 0 && p.Y - MouseStartDrag.Y <= 0) this.Location = new Point(p.X - MouseDownLocation.X, this.Location.Y); else if (p.Y - MouseStartDrag.Y > 0 && p.X - MouseStartDrag.X >= 0) this.Location = new Point(this.Location.X, p.Y - MouseDownLocation.Y); else if (bBottomLeft == true)//子窗体连在主窗体左下角 if (p.X - MouseStartDrag.X <= -20 || p.Y - MouseStartDrag.Y >= 20) this.Location = new Point(p.X - MouseDownLocation.X, p.Y - MouseDownLocation.Y); else if (p.X - MouseStartDrag.X > 0 && p.Y - MouseStartDrag.Y >= 0) this.Location = new Point(p.X - MouseDownLocation.X, this.Location.Y); else if (p.Y - MouseStartDrag.Y < 0 && p.X - MouseStartDrag.X <= 0) this.Location = new Point(this.Location.X, p.Y - MouseDownLocation.Y); else//子窗体连在主窗体右下角 if (p.X - MouseStartDrag.X >= 20 || p.Y - MouseStartDrag.Y >= 20) this.Location = new Point(p.X - MouseDownLocation.X, p.Y - MouseDownLocation.Y); else if (p.X - MouseStartDrag.X < 0 && p.Y - MouseStartDrag.Y >= 0) this.Location = new Point(p.X - MouseDownLocation.X, this.Location.Y); else if (p.Y - MouseStartDrag.Y < 0 && p.X - MouseStartDrag.X >= 0) this.Location = new Point(this.Location.X, p.Y - MouseDownLocation.Y); else//如果两窗体没有相连 if (f1.Location.X - 20 < this.Location.X + this.Size.Width && this.Location.X + this.Size.Width < f1.Location.X && this.Location.Y + this.Size.Height > f1.Location.Y && this.Location.Y < f1.Location.Y + f1.Size.Height) //当子窗体在主窗体左侧并相距小于20时,子窗体贴向主窗体左侧 this.Location = new Point(f1.Location.X - this.Size.Width, this.Location.Y); MouseStartDrag = Control.MousePosition;//重新设置拖拽起始点 else if (f1.Location.X + f1.Size.Width + 20 > this.Location.X && this.Location.X > f1.Location.X + f1.Size.Width && this.Location.Y + this.Size.Height > f1.Location.Y && this.Location.Y < f1.Location.Y + f1.Size.Height) this.Location = new Point(f1.Location.X + f1.Size.Width, this.Location.Y); MouseStartDrag = Control.MousePosition; else if (f1.Location.Y - 20 < this.Location.Y + this.Size.Height && this.Location.Y + this.Size.Height < f1.Location.Y && this.Location.X + this.Size.Width > f1.Location.X && this.Location.X < f1.Location.X + f1.Size.Width) this.Location = new Point(this.Location.X, f1.Location.Y - this.Size.Height); MouseStartDrag = Control.MousePosition; else if (f1.Location.Y + f1.Size.Height + 20 > this.Location.Y && this.Location.Y > f1.Location.Y + f1.Size.Height && this.Location.X + this.Size.Width > f1.Location.X && this.Location.X < f1.Location.X + f1.Size.Width) this.Location = new Point(this.Location.X, f1.Location.Y + f1.Size.Height); MouseStartDrag = Control.MousePosition; else if (this.Location.X >= f1.Location.X + f1.Size.Width && this.Location.X < f1.Location.X + f1.Size.Width + 20 && this.Location.Y + this.Size.Height <= f1.Location.Y && this.Location.Y + this.Size.Height + 20 > f1.Location.Y) this.Location = new Point(f1.Location.X + f1.Size.Width, f1.Location.Y - this.Size.Height); MouseStartDrag = Control.MousePosition; else if (this.Location.X >= f1.Location.X + f1.Size.Width && this.Location.X < f1.Location.X + f1.Size.Width + 20 && this.Location.Y >= f1.Location.Y + f1.Size.Height && this.Location.Y < f1.Location.Y + f1.Size.Height + 20) this.Location = new Point(f1.Location.X + f1.Size.Width, f1.Location.Y + f1.Size.Height); MouseStartDrag = Control.MousePosition; else if (this.Location.X + this.Size.Width <= f1.Location.X && this.Location.X + this.Size.Width > f1.Location.X - 20 && this.Location.Y >= f1.Location.Y + f1.Size.Height && this.Location.Y < f1.Location.Y + f1.Size.Height + 20) this.Location = new Point(f1.Location.X - this.Size.Width, f1.Location.Y + f1.Size.Height); MouseStartDrag = Control.MousePosition; else if (this.Location.X + this.Size.Width <= f1.Location.X && this.Location.X + this.Size.Width > f1.Location.X - 20 && this.Location.Y + this.Size.Height <= f1.Location.Y && this.Location.Y + this.Size.Height + 20 > f1.Location.Y) this.Location = new Point(f1.Location.X - this.Size.Width, f1.Location.Y - this.Size.Height); MouseStartDrag = Control.MousePosition; else //子窗体自由移动 this.Location = new Point(p.X - MouseDownLocation.X, p.Y - MouseDownLocation.Y); public void Set_Form2_NewLocation() if (f1.Location.X - 20 < this.Location.X + this.Size.Width && this.Location.X + this.Size.Width < f1.Location.X && this.Location.Y + this.Size.Height > f1.Location.Y && this.Location.Y < f1.Location.Y + f1.Size.Height) this.Location = new Point(f1.Location.X - this.Size.Width, this.Location.Y); f1.Set_Deviation(); else if (f1.Location.X + f1.Size.Width + 20 > this.Location.X && this.Location.X > f1.Location.X + f1.Size.Width && this.Location.Y + this.Size.Height > f1.Location.Y && this.Location.Y < f1.Location.Y + f1.Size.Height) this.Location = new Point(f1.Location.X + f1.Size.Width, this.Location.Y); f1.Set_Deviation(); else if (f1.Location.Y - 20 < this.Location.Y + this.Size.Height && this.Location.Y + this.Size.Height < f1.Location.Y && this.Location.X + this.Size.Width > f1.Location.X && this.Location.X < f1.Location.X + f1.Size.Width) this.Location = new Point(this.Location.X, f1.Location.Y - this.Size.Height); f1.Set_Deviation(); else if (f1.Location.Y + f1.Size.Height + 20 > this.Location.Y && this.Location.Y > f1.Location.Y + f1.Size.Height && this.Location.X + this.Size.Width > f1.Location.X && this.Location.X <= f1.Location.X + f1.Size.Width) this.Location = new Point(this.Location.X, f1.Location.Y + f1.Size.Height); f1.Set_Deviation(); else if (this.Location.X >= f1.Location.X + f1.Size.Width && this.Location.X < f1.Location.X + f1.Size.Width + 20 && this.Location.Y + this.Size.Height <= f1.Location.Y && this.Location.Y + this.Size.Height + 20 > f1.Location.Y) this.Location = new Point(f1.Location.X + f1.Size.Width, f1.Location.Y - this.Size.Height); f1.Set_Deviation(); else if (this.Location.X >= f1.Location.X + f1.Size.Width && this.Location.X < f1.Location.X + f1.Size.Width + 20 && this.Location.Y >= f1.Location.Y + f1.Size.Height && this.Location.Y < f1.Location.Y + f1.Size.Height + 20) this.Location = new Point(f1.Location.X + f1.Size.Width, f1.Location.Y + f1.Size.Height); f1.Set_Deviation(); else if (this.Location.X + this.Size.Width <= f1.Location.X && this.Location.X + this.Size.Width > f1.Location.X - 20 && this.Location.Y >= f1.Location.Y + f1.Size.Height && this.Location.Y < f1.Location.Y + f1.Size.Height + 20) this.Location = new Point(f1.Location.X - this.Size.Width, f1.Location.Y + f1.Size.Height); f1.Set_Deviation(); else if (this.Location.X + this.Size.Width <= f1.Location.X && this.Location.X + this.Size.Width > f1.Location.X - 20 && this.Location.Y + this.Size.Height <= f1.Location.Y && this.Location.Y + this.Size.Height + 20 > f1.Location.Y) this.Location = new Point(f1.Location.X - this.Size.Width, f1.Location.Y - this.Size.Height); f1.Set_Deviation(); 1、当切换两窗体的焦点时,子窗体的Location属性为什么会发生变化? 2、当最小化主窗体后,再恢复主窗体,子窗体却出不来了? 问题1没重现 问题2,你在Form1的Load中加一句: form.Owner = this;//设置owner C# code private void Form1_Load(object sender, EventArgs e) //磁性窗体的页面加载事件《下》; _x = this.Location.X + this.Width; //变量_x等于窗体x轴大小; _y = this.Location.Y; //变量_y等于窗体y轴大小; form.Owner = this;//设置owner form.Location = new Point(_x, _y); //初始化窗体的大小,相当于自定义; form.Show(); //磁性窗体的页面加载事件《上》;//show出窗体;
象QQ那样拖曳到屏幕边上时缩到边上去
象QQ那样拖曳到屏幕边上时缩到边上去 private void Form1_MouseLeave(object sender, System.EventArgs e) const int j = 5; // 要故意露出在右上的高度 if (this.Top <1) //如果当前X 已经是在最顶 // 并且Y 也已经在最右边 if (this.Left > = Screen.PrimaryScreen.WorkingArea.Width - this.Width) // 开始往上移 while(this.Top > = 0-this.Height + j) this.Top --; private void Form1_MouseEnter(object sender, System.EventArgs e) if (this.Top <0) // 这里是移回正常位置的代码你接上面的逆着做就是了
用C#实现了一个切换当前活动窗口的功能
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; using System.Diagnostics; namespace testKMPlayerWinForm public partial class Form1 : Form [System.Runtime.InteropServices.DllImport("user32.dll")] public static extern bool SetForegroundWindow(IntPtr hWnd); System.Diagnostics.Process Proc; String pn; public Form1() InitializeComponent(); private void button1_Click(object sender, EventArgs e) Proc = new System.Diagnostics.Process(); Proc.StartInfo.FileName = "C:/Program Files/The KMPlayer/KMPlayer.exe"; Proc.Start(); pn = Proc.ProcessName; System.Threading.Thread.Sleep(1000); SendKeys.Send("^u"); private void button2_Click(object sender, EventArgs e) System.Diagnostics.Process[] p = System.Diagnostics.Process.GetProcessesByName(pn); if (p.Length > 0) SetForegroundWindow(p[0].MainWindowHandle); System.Threading.Thread.Sleep(1000); SendKeys.Send("^u"); else button1_Click(sender, e);
以上是关于C# Winform多窗口间切换的主要内容,如果未能解决你的问题,请参考以下文章