C#中制作启动窗体的方法和问题

来源:互联网 发布:ping ip加端口 编辑:程序博客网 时间:2024/04/26 08:53


       在开发windows桌面程序时,经常碰到的一个问题就是:在主窗体显示之前,需要加载大量数据,这样,当用户启动程序后,需要等待一段时间才可以看到主窗体。好的程序设计人员会为软件加上一个启动窗体,并在后台执行加载数据的代码,典型的应用如VS系列、PhotoShop等软件。用户一旦运行程序,首先看到的是启动窗体以及窗体上显示的相关信息,以避免用户产生启动程序后没有反应的误解。

       比如我的主窗体名称是MainForm,启动窗体名称是SplachForm,在显示MainForm之前需要加载大量数据,那么可以先显示SplachForm,并在上面以文字或进度条的形式显示数据加载的情况,用户知道应用程序在做什么,也就可以耐心等待了。

       简单的做法是修改Application.Run()方法的参数,把主窗体改为SplachForm,当数据加载完成时,隐藏SplachForm,显示MainForm。这里不可以关闭SplachForm,因为C#中,关闭Application.Run方法中调用的窗体对象,将会退出整个应用程序。

       上面这个做法的缺点是不可以在MainForm中使用Close方法来退出程序,因为SplachForm只是隐藏,程序是无法退出的,必须使用Application.Exit()方法来退出整个应用程序。

       稍好一点的做法是,Application.Run方法的参数仍然是MainForm对象,在MainForm窗体的构造函数中添加以下代码:

       SplachForm form=new SplachForm();

       form.ShowDialog();

       在SplachForm的Load事件中添加代码:

       this.Show();

       this.Refresh();

       Init();      //加载数据的方法

       this.Close();

       这样主窗体仍然是MainForm,并且在加载完数据后自动显示MainForm。

       这个做法虽然简单,但实际效果并不差。不过只适用于启动窗体消失后必然显示MainForm窗体的情况,如果在启动窗体消失后,因为某种原因需要退出程序,效果就不行了,无论怎么处理,主窗体仍然会被显示,即使把上面的this.Close()改成Application.Exit(),主窗体也会显示一下才退出程序。这是因为Application.Run方法的特性造成的,它使调用的窗体可见,并在退出程序时返回到调用的地方。

       更好的做法是使用线程技术,把启动窗体和主窗体分为不同线程,先创建启动窗体的线程,在完成加载数据的方法后,创建主窗体的线程,同时关闭启动窗体线程。例如启动窗体加载数据之后,需要显示登录窗体,并根据用户的登录情况来决定是否显示主窗体,用这种方式实现就非常好。当用户登录失败或放弃登录时,不创建主窗体线程,退出程序,不会出现第二种方法的情况。需要注意的是,在VS2005以上的版本中,有一个线程调用安全的问题。

       三种方式都用过,第一种简单,效果不太好。第二种也简单,在只有启动窗体并在启动窗体完成后直接进入主程序的情况下,效果也不错。第三种稍为麻烦,但可以处理的情况更多,如在主窗体显示之前要显示多个窗体,目前我只能用第三种方法来实现。

0 0
原创粉丝点击