如果程序在裝載時需要進行較長時間的處理,最好使用啟動畫面,一方面美化程序,一方面可以不使用戶面對著一片空白的程序界面。
我手頭上一個小項目主界面啟動時需要檢查用戶文件及運行環境是否有效,需要一段時間處理,因此想到要添加一個啟動畫面,在網上搜了一陣,發現下面兩個方案:
1、用C#給程序加啟動畫面並只允許一個應用程序實例運行
http://www.zahui.com/html/14/36790.htm
2、HOW TO:濺射屏幕(Splash Screen),也叫程序啟動畫面的制作(.NET2003)
http://lzmtw.cnblogs.com/archive/2005/10/31/265782.html
第一個方案在實現與界面分離上做得不夠好,啟動界面(一個窗體)依賴於特定窗體,主窗體還必須添加一個PreLoad方法完成裝載任務,只能在代碼級重用。而且那個只允許一個實例的寫法也太....
第二個方案框架很好,但細微處理可能存在一點問題,需要判斷主窗體的WindowState,整個代碼也較復雜。
我改動了一下,基本結構仿照第二個方案。
功能:為程序添加啟動界面,顯示啟動界面的同時加載主窗體,主窗體加載完畢後關閉啟動界面,顯示主窗體。啟動畫面停留的時間是設定的時間和主窗體裝載所需時間兩個的最大值。啟動畫面在另一個線程上運行。
程序代碼如下:
//啟動窗體虛基類,繼承自ApplicationContext
using System.Windows.Forms;
using System.Threading;
using System;
//啟動畫面虛基類,啟動畫面會停留一段時間,該時間是設定的時間和主窗體構造所需時間兩個的最大值
public abstract class SplashScreenApplicationContext : ApplicationContext
{
private Form _SplashScreenForm;//啟動窗體
private Form _PrimaryForm;//主窗體
private System.Timers.Timer _SplashScreenTimer;
private int _SplashScreenTimerInterVal = 5000;//默認是啟動窗體顯示5秒
private bool _bSplashScreenClosed = false;
private delegate void DisposeDelegate();//關閉委托,下面需要使用控件的Invoke方法,該方法需要這個委托
public SplashScreenApplicationContext()
{
this.ShowSplashScreen();//這裡創建和顯示啟動窗體
this.MainFormLoad();//這裡創建和顯示啟動主窗體
}
protected abstract void OnCreateSplashScreenForm();
protected abstract void OnCreateMainForm();
protected abstract void SetSeconds();
protected Form SplashScreenForm
{
set
{
this._SplashScreenForm = value;
}
}
protected Form PrimaryForm
{//在派生類中重寫OnCreateMainForm方法,在MainFormLoad方法中調用OnCreateMainForm方法
// ,在這裡才會真正調用Form1(主窗體)的構造函數,即在啟動窗體顯示後再調用主窗體的構造函數
// ,以避免這種情況:主窗體構造所需時間較長,在屏幕上許久沒有響應,看不到啟動窗體
set
{
this._PrimaryForm = value;
}
}
protected int SecondsShow
{//未設置啟動畫面停留時間時,使用默認時間
set
{
if (value != 0