我有两个窗体,一个是主窗体 MainForm,用来显示欢迎信息。一个是登陆窗口,LoginForm,用来登陆。我的思路是:用Timer控件显示一段时间的欢迎界面,然后主窗体退出,登陆窗体显示,请问如何实现?以下是我的代码,可是主窗体运行完毕以后,刚刚打开登陆窗体,就全部关闭了,请大家帮我看看,问题出在那里?private void MainForm_Load(object sender, System.EventArgs e)
{
timer1.Enabled=true;
timer2.Interval=3000;
}private void timer1_Tick(object sender, System.EventArgs e)
{
ShowForm();
}private void timer2_Tick(object sender, System.EventArgs e)
{
timer2.Enabled=false;
timer3.Enabled=true;
}private void timer3_Tick(object sender, System.EventArgs e)
{
HidForm();
}
private void ShowForm(){ ... ... } private void HidForm()
{
... ... this.timer3.Enabled=false;
LoadLoginForm();
}private void LoadLoginForm()
{
LoginForm logForm=new LoginForm();
logForm.Show(); //登陆窗口打开
this.Close(); //主窗口退出
}我觉得,问题好象出在 LoadLoginForm()这个方法上,但是如果不这么弄,怎么实现第一个窗体淡入淡出,第二个窗体显示出来的效果??请高手指点,谢谢
{
timer1.Enabled=true;
timer2.Interval=3000;
}private void timer1_Tick(object sender, System.EventArgs e)
{
ShowForm();
}private void timer2_Tick(object sender, System.EventArgs e)
{
timer2.Enabled=false;
timer3.Enabled=true;
}private void timer3_Tick(object sender, System.EventArgs e)
{
HidForm();
}
private void ShowForm(){ ... ... } private void HidForm()
{
... ... this.timer3.Enabled=false;
LoadLoginForm();
}private void LoadLoginForm()
{
LoginForm logForm=new LoginForm();
logForm.Show(); //登陆窗口打开
this.Close(); //主窗口退出
}我觉得,问题好象出在 LoadLoginForm()这个方法上,但是如果不这么弄,怎么实现第一个窗体淡入淡出,第二个窗体显示出来的效果??请高手指点,谢谢
http://community.csdn.net/Expert/topic/4396/4396340.xml?temp=.8270838我的建议是使用Application.Run(ApplicationContext)方法。
http://www.codeproject.com/csharp/apploadingarticle.asp
http://www.codeproject.com/csharp/ApplicationContextSplash.asp无一例外都是用ApplicationContext来实现的。
欢迎窗体用线程
{
LoginForm logForm=new LoginForm();
//logForm.Show(); //登陆窗口打开
logForm.ShowDialog();//改动一下试试
this.Close(); //主窗口退出
}
private void LoadLoginForm()
{
LoginForm logForm=new LoginForm();
this.Hide();
logForm.ShowDialog();//改动一下试试
}
在你第一窗体里写代码
private void LoadLoginForm()
{
LoginForm logForm=new LoginForm();
logForm.loadloginForm = this ;//这个是关键
logForm.Show(); //登陆窗口打开
this.Hide(); //主窗口隐藏
}在你的 LoginForm 里
添加
public LoadLoginForm loadloginForm; //这个属性因为你要是直接把this.Close(); //主窗口退出那应用程序就直接退出了
要是你用this.Hide(); //主窗口隐藏 你把以后的窗体关闭后你的LoadLoginForm作为主程序还在进程里的没有真正关闭的。你要在其它界面调用你传递的“logForm.loadloginForm = this ;//这个是关键”执行 logForm.loadloginForm.Close () 关闭整个程序。
建议大家都用 ApplicationContext 的方法来解决这样的问题,很方便,也很合适。
--------------- 1,首先建立主程序运行基类 -------------------------
using System;
using System.Drawing;
using System.Windows.Forms;
using System.ComponentModel;
using System.Text;
using System.IO;namespace BBZ.Win
{
/// <summary>
/// AppBase 的摘要说明。
/// </summary>
public class AppContext :ApplicationContext
{
private Welcome fm1;
private Login fm2;
private MainForm fm3;
//构造函数
public AppContext()
{
//实例化Form窗体
fm1=new Welcome();
fm2=new Login();
fm3=new MainForm();
//订阅窗体关闭事件
fm1.Closed += new EventHandler(fm1_Closed);
fm1.Closing +=new CancelEventHandler(fm1_Closing);
fm2.Closed += new EventHandler(fm2_Closed);
fm2.Closing += new CancelEventHandler(fm2_Closing);
fm3.Closed += new EventHandler(fm3_Closed);
fm3.Closing += new CancelEventHandler(fm3_Closing);
fm1.Show();
fm2.Hide();
fm3.Hide();
}
#region **---- 窗体关闭事件 ----**
//FM1窗体关闭事件
private void fm1_Closed(object sender,EventArgs e)
{
fm1.Dispose();
fm2.Show();
}
private void fm1_Closing(object sender,CancelEventArgs e)
{
}
//FM2窗体关闭事件
private void fm2_Closed(object sender,EventArgs e)
{
fm2.Dispose();
fm3.Show();
}
private void fm2_Closing(object sender,CancelEventArgs e)
{
}
//FM3 主窗体关闭事件
private void fm3_Closed(object sender,EventArgs e)
{
fm3.Dispose();
this.ExitThread();
this.Dispose();
}
private void fm3_Closing(object sender,CancelEventArgs e)
{
}
#endregion
#region **---- 主程序入口点 ----**
[STAThread]
static void Main()
{
AppContext app=new AppContext();
Application.Run(app);
}
#endregion
}
}------------------------- 2 建立三个窗体 ----------------------------------
WelcomeForm.cs 、LoginForm.cs、MainForm.cs三个窗体执行完自己的操作以后,只要调用自己的 this.close();就可以了。
AppContext 主线程运行程序会监控到哪个窗体关闭了,然后该执行哪个步骤。------------------------------------------------------------------------------小弟这个代码是精简过的,有不适当的地方,还请指出,谢谢