SplashScreen,就是平时我们说的溅射屏幕,任何一个做过客户端程序的coder应该对它都不陌生,因为它能提升用户体验,让软件看上去更美。SplashScreenForm通常进入程序时是打开,主窗体加载完毕后退出。一般来说,SplashScreenForm比较简洁,窗体的内容只是显示程序主题、版权等信息;复杂些的,可以显示主程序的加载项目情况。
下面是我实现的一个SplashScreen类:
using System;
using System.Collections.Generic;
using System.Text; using System.Windows.Forms; using System.Threading; using System.Reflection; namespace SplashScreen { public class SplashScreen { private static object _obj = new object(); private static Form _SplashForm = null; private static Thread _SplashThread = null; private delegate void ChangeFormTextdelegate(string s); public static void Show(Type splashFormType) { if (_SplashThread != null) return; if (splashFormType == null) { throw (new Exception()); } _SplashThread = new Thread(new ThreadStart(delegate() { CreateInstance(splashFormType); Application.Run(_SplashForm); })); _SplashThread.IsBackground = true; _SplashThread.SetApartmentState(ApartmentState.STA); _SplashThread.Start(); } public static void ChangeTitle(string status) { ChangeFormTextdelegate de = new ChangeFormTextdelegate(ChangeText); _SplashForm.Invoke(de, status); } public static void Close() { if (_SplashThread == null || _SplashForm == null) return; try { _SplashForm.Invoke(new MethodInvoker(_SplashForm.Close)); } catch (Exception) { } _SplashThread = null; _SplashForm = null; } private static void ChangeText(string title) { _SplashForm.Text = title.ToString(); } private static void CreateInstance(Type FormType) { if (_SplashForm == null) { lock (_obj) { object obj = FormType.InvokeMember(null, BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.CreateInstance, null, null, null); _SplashForm = obj as Form; _SplashForm.TopMost = true; _SplashForm.ShowInTaskbar = false; _SplashForm.BringToFront(); _SplashForm.StartPosition = FormStartPosition.CenterScreen; if (_SplashForm == null) { throw (new Exception()); } } } } } }
调用的时候只需要传入你需要作为溅射屏幕的窗体,然后在主窗体加载完毕后调用close方法:
namespace SplashScreen
{
public partial class MainForm : Form { public MainForm() { SplashScreen.Show(typeof(SplashForm)); InitializeComponent(); Thread.Sleep(1000); SplashScreen.ChangeTitle("111"); Thread.Sleep(1000); SplashScreen.ChangeTitle("222"); Thread.Sleep(1000); SplashScreen.ChangeTitle("333"); Thread.Sleep(1000); SplashScreen.ChangeTitle("444"); SplashScreen.Close(); } } }