我有两个窗体,一个是主窗体 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()这个方法上,但是如果不这么弄,怎么实现第一个窗体淡入淡出,第二个窗体显示出来的效果??请高手指点,谢谢

解决方案 »

  1.   

    你的问题类似于这个:
    http://community.csdn.net/Expert/topic/4396/4396340.xml?temp=.8270838我的建议是使用Application.Run(ApplicationContext)方法。
      

  2.   

    要做splash screen,请参考这两篇文章:
    http://www.codeproject.com/csharp/apploadingarticle.asp
    http://www.codeproject.com/csharp/ApplicationContextSplash.asp无一例外都是用ApplicationContext来实现的。
      

  3.   

    如果是这样,那么请问,每次点击工具栏的不同按钮,就显示不同的编辑界面,难道是用“panel+用户控件”的方式做的?而不是看上去好象很多窗体在切换吗?求教~~
      

  4.   

    试试用 Thread
    欢迎窗体用线程
      

  5.   

    private void LoadLoginForm()
    {
        LoginForm logForm=new LoginForm();
        //logForm.Show();       //登陆窗口打开
        logForm.ShowDialog();//改动一下试试
        this.Close();         //主窗口退出
    }
      

  6.   

    或者:
    private void LoadLoginForm()
    {
        LoginForm logForm=new LoginForm();
        this.Hide();
        logForm.ShowDialog();//改动一下试试
    }
      

  7.   

    偶得建议
    在你第一窗体里写代码
    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 () 关闭整个程序。
      

  8.   

    问题解决了,还是ApplicationContext方法比较合适。
    建议大家都用 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 主线程运行程序会监控到哪个窗体关闭了,然后该执行哪个步骤。------------------------------------------------------------------------------小弟这个代码是精简过的,有不适当的地方,还请指出,谢谢