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

发布时间:2011年03月16日      浏览次数:493 次
在开发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以上的版本中,有一个线程调用安全的问题。
三种方式都用过,第一种简单,效果不太好。第二种也简单,在只有启动窗体并在启动窗体完成后直接进入主程序的情况下,效果也不错。第三种稍为麻烦,但可以处理的情况更多,如在主窗体显示之前要显示多个窗体,目前我只能用第三种方法来实现。第三种方法的代码较多,懒得打字贴代码了,记上一笔,以免日后又忘了……
免责声明:本站相关技术文章信息部分来自网络,目的主要是传播更多信息,如果您认为本站的某些信息侵犯了您的版权,请与我们联系,我们会即时妥善的处理,谢谢合作!