There are different ways of creating splash screens:
-
You can rely on the splash screen feature of
WindowsFormsApplicationBase
-
You can show implement the feature yourself by showing a form on a different UI thread and hiding it after the main from loaded successfully.
In this post I’ll show an example of both solutions.
Note: Those who are looking for showing a loading window or a loading
gif animation during loading of data, can take a look at this post: Show Loading animation during loading data in other thread
Option 1 – Use WindowsFormsApplicationBase Splash Screen feature
- Add a reference of
Microsoft.VisualBasic.dll
to your project. - Create a
MyApplication
class by deriving fromWindowsFormsApplicationBase
- override
OnCreateMainForm
and assign the from that you want to be the startup form toMainForm
property. -
Override
OnCreateSplashScreen
and assign the form that you want to show as splash screen toSplashScreen
property. -
In your
Main
method, create an instance ofMyApplication
and call itsRun
method.
Example
using System;
using System.Windows.Forms;
using Microsoft.VisualBasic.ApplicationServices;
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(true);
var app = new MyApplication();
app.Run(Environment.GetCommandLineArgs());
}
}
public class MyApplication : WindowsFormsApplicationBase
{
protected override void OnCreateMainForm()
{
MainForm = new YourMainForm();
}
protected override void OnCreateSplashScreen()
{
SplashScreen = new YourSplashForm();
}
}
Option 2 – Implement the feature using a different UI thread
You can implement the feature yourself by showing the splash screen in a different UI thread. To do so, you can subscribe to Load
event of the main form in Program
class, and show and close your splash screen there.
Example
using System;
using System.Threading;
using System.Windows.Forms;
static class Program
{
static Form SplashScreen;
static Form MainForm;
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
//Show Splash Form
SplashScreen = new Form();
var splashThread = new Thread(new ThreadStart(
() => Application.Run(SplashScreen)));
splashThread.SetApartmentState(ApartmentState.STA);
splashThread.Start();
//Create and Show Main Form
MainForm = new Form8();
MainForm.Load += MainForm_LoadCompleted;
Application.Run(MainForm);
}
private static void MainForm_LoadCompleted(object sender, EventArgs e)
{
if (SplashScreen != null && !SplashScreen.Disposing && !SplashScreen.IsDisposed)
SplashScreen.Invoke(new Action(() => SplashScreen.Close()));
MainForm.TopMost = true;
MainForm.Activate();
MainForm.TopMost = false;
}
}
Note: To show a smooth edge custom shaped splash screen take a look at
this post: Windows Forms Transparent Background
Image.