
Introduction
This article will show you how to display a splash screen during application initialization using C# in VS2005 IDE.
Background
Sometimes, we have to put a lot of initialization code into the MainForm
's OnLoad()
override. Due to this, when the application starts up, it looks like a mess: The main application form just doesn't pop up nicely and ready to be used. Now we need to create a splash screen, let's begin.
Preparations
- Create a Windows Forms project Named
SplashScreen
- Delete Form1.cs
- Add a new
Form
named frmMain
1. Creating the Core Code
Firstly, create an interface called ISplashForm
, which includes a method named SetStatusInfo
in order to display the loading status on the splash screen. Once done, the interface should look like this:
public interface ISplashForm
{
void SetStatusInfo(string NewStatusInfo);
}
Secondly, create a class called Splasher
, where static
members Show
, Close
and the Status
writeonly property can be used as their names suggest to show and close the Splash Screen as well as to update the loading status displayed on the SplashForm
. Here is what the implementation of the class looks like:
using System;
using System.Windows.Forms;
using System.Threading;
using System.Reflection;
public class Splasher
{
private static Form m_SplashForm = null;
private static ISplashForm m_SplashInterface = null;
private static Thread m_SplashThread = null;
private static string m_TempStatus = string.Empty;
public static void Show(Type splashFormType)
{
if (m_SplashThread != null)
return;
if (splashFormType == null)
{
throw (new Exception("splashFormType is null"));
}
m_SplashThread = new Thread(new ThreadStart(delegate()
{
CreateInstance(splashFormType);
Application.Run(m_SplashForm);
}));
m_SplashThread.IsBackground = true;
m_SplashThread.SetApartmentState(ApartmentState.STA);
m_SplashThread.Start();
}
public static string Status
{
set
{
if (m_SplashInterface == null || m_SplashForm == null)
{
m_TempStatus = value;
return;
}
m_SplashForm.Invoke(
new SplashStatusChangedHandle(delegate(string str)
{ m_SplashInterface.SetStatusInfo(str); }),
new object[] { value }
);
}
}
public static void Close()
{
if (m_SplashThread == null || m_SplashForm == null) return;
try
{
m_SplashForm.Invoke(new MethodInvoker(m_SplashForm.Close));
}
catch (Exception)
{
}
m_SplashThread = null;
m_SplashForm = null;
}
private static void CreateInstance(Type FormType)
{
object obj = FormType.InvokeMember(null,
BindingFlags.DeclaredOnly |
BindingFlags.Public |
BindingFlags.NonPublic |
BindingFlags.Instance |
BindingFlags.CreateInstance, null, null, null);
m_SplashForm = obj as Form;
m_SplashInterface = obj as ISplashForm;
if (m_SplashForm == null)
{
throw (new Exception("Splash Screen must inherit from
System.Windows.Forms.Form"));
}
if (m_SplashInterface == null)
{
throw (new Exception("must implement interface ISplashForm"));
}
if (!string.IsNullOrEmpty(m_TempStatus))
m_SplashInterface.SetStatusInfo(m_TempStatus);
}
private delegate void SplashStatusChangedHandle(string NewStatusInfo);
}
2. Creating the Splash Screen
Just create a new Windows Form named frmSplash
. The form should be centered on the screen (StartPosition
), be topmost (TopMost
) and shouldn't have a border (FormBorderStyle
), set the BackgroundImage
property to your splash image and set the form size equal to the image size. In order to display the loading status on the form, we need to place a label on the form and then implement ISplashForm
. If the label is called lbStatusInfo
, the ISplashForm
implementation should look like this:
void ISplashForm.SetStatusInfo(string NewStatusInfo)
{
lbStatusInfo.Text = NewStatusInfo;
}
3. Modifying the MainForm's code
Now we need to make some modifications to the frmMain
class. Once done, the constructed function should look somewhat like this:
public frmMain()
{
Splasher.Status = "Creating MainForm...";
System.Threading.Thread.Sleep(1000);
InitializeComponent();
Splasher.Status = "Loading Files...";
System.Threading.Thread.Sleep(1500);
Splasher.Status = "Loading Plug/Ins...";
System.Threading.Thread.Sleep(1500);
Splasher.Status = "Sleeping 1 second...";
System.Threading.Thread.Sleep(1000);
Splasher.Close();
}
4. Modifying the Entry Point function
In order to use Splash Screen, we have to modify our entry point function appropriately:
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Splasher.Show(typeof(frmSplash));
frmMain MyMainForm = new frmMain();
Application.Run(MyMainForm);
}
That's all about it.