有三个窗体,Login,Splash,Main程序启动加载Login,登录后本应进入Main窗体,但由于Main窗体加载时间过长,所以希望先显示Splash窗体,等Main窗体加载完毕后,Main显示,关闭Splash求教代码如何完成?

解决方案 »

  1.   

    你想实现的也就是像QQ登录的界面一样吧!加载完后,在现实主窗体,Splash将它的在任务栏显示的去掉,挡在Main窗体前或者是将Main窗体的透明度设置为0等加载完了在现实出来!但是要控制两个窗体的坐标位置,并且要通过多线程来实现两个窗体的同时加载,而且一定要注意窗体的闪烁的情况,一般会用到双缓冲和重绘技术。
      

  2.   

    加载mian窗口时先让Splash窗口显示,然后,在mian窗口加载完后的瞬间关闭Splash窗口
      

  3.   

      private void B_Load(object sender, EventArgs e)
            {
                Form2 ss = new Form2();
                ss.Show();
                for (int i = 0; i < 100000; i++)
                {
                    button1.Text = i.ToString();
                }
                ss.Close();
            }
    经测试,,可以。。
      

  4.   


    重点是要分析Main窗体中为什么加载时间过长?通常都是由于查询数据库或一些计算引起的,可以将这部分内容放在线程中处理。
    进入线程前先隐藏Main窗体,显示splash窗体。
    进入线程,线程执行完毕后,关闭splash窗体,将数据显示/绑定到Main窗体,显示Main窗体。注意:在线程中是不能够直接访问UI元素的。具体实现可参阅MSDN,关键字BackgroupWorker
      

  5.   

    这个看样子得用线程,Splash窗体相当于查询数据时的进度条显示窗体.
      

  6.   

    不过,顺序也可以不必非要登陆->splash->main。你的程序是否允许用户注销?或者先不登录(点取消进入)。有的时候这样也是必要的,需要用什么帐号登陆时在登陆。不许使用就可以注销而非退出程序。当离开时,可以防止别人用这个帐号操作。
    这样的活你的菜单中应该有登陆和注销,那这样的话你就可以使用项目管理器设置初始屏幕为splash窗体。启动窗体为main。在main窗体里加载必要的数据以及设置。在main窗体的Shown事件里显示登陆窗体。试试这样如何?
      

  7.   

    LZ可参考
    我自己做了一个闪屏类,专门用于加载我的主窗体时用。该类可实现启动和关闭时的渐隐渐现效果,动态显示正在加载的内容,多线程的准确的动态进度条(注意是准确的,不是类似于延时、循环等假的,只为了增强用户体验的那种)。
    我一般在会在该类中检查程序的环境,数据库的可用否,网络连接可用否,是否缺失必要文件等等操作,加载完后,启动 LoadRunMainProgram函数来加载主窗体,窗体加载完后(注意是真实的加载完,不是利用延时等假的方法),关闭闪屏。主要代码如下
    主程序Program.CS                //弹出初始化界面
                    MySplash.ShowSplash();                MySplash.SetStatus("正在加载模块1......");
                    MySplash.SetStatus("正在加载模块2......");
                    MySplash.SetStatus("正在加载模块3......");
                    MySplash.SetStatus("正在加载模块4......");
                    MySplash.SetStatus("所有模块加载完毕");
                    Application.DoEvents();
                    //System.Threading.Thread.Sleep(5);
                    MySplash.SetStatus("正在加载主窗体");
                    MySplash.LoadRunMainProgram(new Form_Main());只需要把你的 Application.Run(new Form_Main()); 替换成 MySplash.LoadRunMainProgram(new Form_Main());就可以闪屏的LoadRunMainProgram 主要代码
            static public void LoadRunMainProgram(Form form)
            {
                //订阅主窗体的句柄创建事件 
                form.HandleCreated += delegate
                {
                    //启动新线程来显示Splash窗体
                    new Thread(new ThreadStart(delegate
                        {
                            form.Shown += delegate
                            {
                                //通知Splash窗体关闭自身 
                                frmSplash.Invoke(new EventHandler(frmSplash.KillMe));
                            };
                        })).Start();
                };
                //显示主窗体
                Application.Run(form);
            }