很多程序在开始的时候先显示一个对话框一段时间。例如“XXX系统”,然后跳到主窗体。请问这个是怎么实现的,最好给个代码。

解决方案 »

  1.   

    那个是Flash窗体.一般是为了界面友好在加载程序时显示出来的
      

  2.   

    如果你的程序启动很快的话.
    只要在做一个这样的窗体,放一个Timer控件在里面.
    Timer_Tick(...)
    {
     this.Close();
    }然后Main()函数这样写:
    FlashForm frmFlash = new FlashForm();
    frmFlash.ShowDialog();Application.Run(new Form1());
      

  3.   

    新建一个对话框窗体,FormBorderStyle设为None,
    设对话框窗体Name为FlashForm,主窗体为MainForm,MainForm为启动窗体。
    在MainForm的Load事件中写:private void MainForm_Load(object sender, EventArgs e)
    {
        FlashForm A = new FlashForm();
        A.Show();
        Thread.Sleep(3000);
        A.Close();
    }
      

  4.   

    呵呵,好像不行,因为显示模态窗口,动画是静止的
    可以用Applaction.Run()或是创建新的Domain
      

  5.   

    Thread.Sleep()是让一个线程暂停的方法,使用要先添加using语句using System.Threading;
    Thread.Sleep(3000)中的3000为暂停的毫秒数,越大停得越久。
      

  6.   

    这是一个启动封面,可以参见秋枫给我的参考地址,我很受启发,需要自己做一个类http://www.codeproject.com/netcf/casoast.asp?target=splashForm
    http://www.codeproject.com/csharp/apploadingarticle.asp?target=splashForm
    http://www.codeproject.com/csharp/ApplicationContextSplash.asp?target=splashForm这是我的启动类
                 #region 应用程序的主入口点
    /// <summary>
    /// 应用程序的主入口点。
                      ///FormMain是主界面
                      ///Splash启动封面
    /// </summary>
    public static void Main() 
    {
                SplashAppContext myContext = new SplashAppContext(new FormMain(),new Splash());
                Application.Run(myContext);
                } #endregion
        public class SplashAppContext : ApplicationContext
        {
            Form mainForm = null;
            Form splashForm = null;        public SplashAppContext(Form mainForm, Form splashForm) : base(splashForm)
            {
                this.mainForm = mainForm;
                this.splashForm = splashForm;
             
            }
            protected override void OnMainFormClosed(object sender, EventArgs e)
            {
                if (sender==splashForm)
                {
                    base.MainForm = this.mainForm;
                }
                else if (sender==mainForm)
                {
                    base.OnMainFormClosed(sender, e);
                }
            }
                
        }
    }
      

  7.   

    我很迷惑!但还是忍不住要问:
    到底是FlashForm还是SplashScreen(.net 2.0之后才有)?还有就是frmFlash.ShowDialog之后的Application.Run(new Form1());必须要等frmFlash关闭之后才能运行,这样的话能实现SplashScreen的效果吗?
    请不要误导他人!
      

  8.   

    按照生铁的方法做了之后发现放在form上的picturebox的图片显示不出来。
      

  9.   

    当SplashAppContext myContext = new SplashAppContext(new FormMain(),new Splash())运行时,启动界面和主界面已经实例化了,只是你在什么时候调用FormMain.Show().
    我的部分代码如下,我这里有一个MainApp类,它实例化启动封面和主界面,当启动封面启动一定时间后,将主界面显示,然后再关闭启动封面,你应在启动封面内用定时器的方法调用MainApp.getFormMain().Show(),注意启动封面的TopMost属性设为True,并设置它的Opacity属性,使启动封面淡入淡出.namespace MyApp
    {
    /// <summary>
    /// MainApp 的摘要说明。
    /// </summary>
    public class MainApp
    {
    //饿汉式单例
    private static FormMain formMain=new FormMain();
    private static Start start=new Start(); //私有构造子
    private MainApp()
    {} public static FormMain getFormMain()
    {
    return formMain;
    }
    public static Start getStart()
    {
    return start;
    }
            public static WaringForm getWaringForm()
            {
                return waringForm;
            } //入口
    #region 应用程序的主入口点
    /// <summary>
    /// 应用程序的主入口点。
    /// </summary>
    public static void Main() 
    {
                                SplashAppContext myContext = new SplashAppContext(MainApp.getFormMain(), MainApp.getStart());
                    Application.Run(myContext);
                            //Application.Exit();
    } #endregion }
        public class SplashAppContext : ApplicationContext
        {
            Form mainForm = null;
            Form splashForm = null;        public SplashAppContext(Form mainForm, Form splashForm) : base(splashForm)
            {
                this.mainForm = mainForm;
                this.splashForm = splashForm;
             
            }
            protected override void OnMainFormClosed(object sender, EventArgs e)
            {
                if (sender==splashForm)
                {
                    base.MainForm = this.mainForm;
                }
                else if (sender==mainForm)
                {
                   // MainApp.getWaringForm().Close();
                    base.OnMainFormClosed(sender, e);
                }
            }
                
        }
    }
      

  10.   

    刚才的代码中请去掉
        public static WaringForm getWaringForm()
            {
                return waringForm;
            }
      

  11.   

    先说声sorry JimFire(阿达),上面我的代码我没测试过,刚刚测试了一下,确实是不行。sorry
    高深的方法我不会,不过简单的方法想了一个。试过了,可以实现。两个窗体,FlashForm MainForm 两个窗体的StartPosition都为CertenScreen(窗体居中显示)
    在FlashForm中加一个timer控件,FlashForm的Opacity属性改为0%(使窗体透明),然后->给FlashForm添加两个整型的变量,用来记录FlashForm出现的时间。
    public class FlashForm : Form
    {
        private int startTime;
        private int endTime;
    }MainForm的Load事件中写
    private void MainForm_Load(object sender, EventArgs e)
    {
        FlashForm A = new FlashForm();
        A.ShowDialog();
    }FlashFormLoad事件中写
    private void FlashForm_Load(object sender, EventArgs e)
    {
        startTime = Environment.TickCount;
        this.timer1.Enabled = true;
    }timer控件Tick事件中写
    private void timer1_Tick(object sender, EventArgs e)
    {
        this.Opacity += 0.05;
        endTime = Environment.TickCount;
        if (endTime - startTime > 5000)
        this.Close();
    }
      

  12.   

    我的程序要在.net 1.1下运行,2.0版本的东西目前用不着,感谢大家给我提的方法。