这几天用到一个小游戏修改器,很小的程序,就2窗口,我发现了一个有趣的东西:点击默认窗体上某按钮,默认窗体消失,出现新窗体操作。点击新窗体上保存确认按钮,新窗体关闭,出现默认窗体。我就琢磨怎么在C#里实现这个效果。
 
我先建立2个窗体:form1和form2,其中form1是程序启动的默认显示窗体,form2是隐藏窗体,通过点击form1上某按钮给显示出来。
 
我先这么写代码:
关于窗体切换显示的东东_窗体//点击form1上button1隐藏form1,显示form2
关于窗体切换显示的东东_窗体
关于窗体切换显示的东东_窗体             private void button1_Click(object sender, EventArgs e)
关于窗体切换显示的东东_窗体             {
关于窗体切换显示的东东_窗体                     this.Hide();
关于窗体切换显示的东东_窗体                     Form2 fm2=new Form2(0;
关于窗体切换显示的东东_窗体                     fm2.Show();
关于窗体切换显示的东东_窗体             }
关于窗体切换显示的东东_窗体//关闭fomr2,显示form1
关于窗体切换显示的东东_窗体
关于窗体切换显示的东东_窗体             private void showfm1(object sender, FormClosingEventArgs e)
关于窗体切换显示的东东_窗体             {
关于窗体切换显示的东东_窗体                     Form1 fm1 = new Form1();
关于窗体切换显示的东东_窗体                     fm1.Show();
关于窗体切换显示的东东_窗体             }
 
试了下,嘿嘿,果然切换自如。
 
不过在关闭程序时候出问题了,关了form1,程序还在后台运行,vs也还是debug模式没切换回代码编辑模式,看样子有问题。
 
自己分析了一下确实也是有问题,form1被隐藏掉之后,每次关闭form2又重新生成一次form1,难怪程序无法终止,看样子又要请教高手了。
 
高手教了一招,将form1的句柄传入form2,在form2关闭时候判断form1是否存在,如果存在就显示它:
关于窗体切换显示的东东_窗体//form1 code
关于窗体切换显示的东东_窗体
关于窗体切换显示的东东_窗体             private void button1_Click(object sender, EventArgs e)
关于窗体切换显示的东东_窗体             {
关于窗体切换显示的东东_窗体                     this.Hide();
关于窗体切换显示的东东_窗体                     Form frm = new Form2(this);
关于窗体切换显示的东东_窗体                     frm.Show();
关于窗体切换显示的东东_窗体             }
关于窗体切换显示的东东_窗体//form2 code
关于窗体切换显示的东东_窗体             private Form m_frm;
关于窗体切换显示的东东_窗体             public Form2(Form frm)
关于窗体切换显示的东东_窗体             {
关于窗体切换显示的东东_窗体                     InitializeComponent();
关于窗体切换显示的东东_窗体                     m_frm = frm;
关于窗体切换显示的东东_窗体             }
关于窗体切换显示的东东_窗体
关于窗体切换显示的东东_窗体             private void showfm1(object sender, FormClosingEventArgs e)
关于窗体切换显示的东东_窗体             {
关于窗体切换显示的东东_窗体                     if (m_frm != null)
关于窗体切换显示的东东_窗体                     {
关于窗体切换显示的东东_窗体                             m_frm.Show();
关于窗体切换显示的东东_窗体                     }
关于窗体切换显示的东东_窗体             }
 
这下好了,再怎么显示关闭form2,也不会出现form1无法正常关闭的事了。但是我又发现一个问题:如果拖动form1的位置,则form2的显示位置还是在默认位置,不是form1隐藏时候的位置。
 
还好这个问题自己就能解决:
关于窗体切换显示的东东_窗体                private void button1_Click(object sender, EventArgs e)
关于窗体切换显示的东东_窗体                {
关于窗体切换显示的东东_窗体                        this.Hide();
关于窗体切换显示的东东_窗体                        Form frm = new Form2(this);
关于窗体切换显示的东东_窗体                        //定义新窗体使用当前窗体的坐标
关于窗体切换显示的东东_窗体                        frm.SetDesktopLocation(this.DesktopLocation.X,this.DesktopLocation.Y);
关于窗体切换显示的东东_窗体                        frm.Show();
关于窗体切换显示的东东_窗体                }
然后将form2的StartPosition设置为Manual即可。
 
又大功告成了。。。。。(为什么要说又)