Windows Forms Splash Screen - Show a form while loading main form
I am trying to make the splash screen appears first and after the splash, the MainForm
appears. But the progress bar which I have in splash screen don't get to the end of the bar. And the program continues running and not works.
How can I show the splash screen during loading the main form?
My code It's something like that :
public partial class SplashForm : Form
{
public SplashForm()
{
InitializeComponent();
}
private void SplashForm_Load(object sender, EventArgs e)
{
timer1.Enabled = true;
timer1.Start();
timer1.Interval = 1000;
progressBar1.Maximum = 10;
timer1.Tick += new EventHandler(timer1_Tick);
}
public void timer1_Tick(object sender, EventArgs e)
{
if (progressBar1.Value != 10)
{
progressBar1.Value++;
}
else
{
timer1.Stop();
Application.Exit();
}
}
}
Here are the first part of the code of the MainForm
:
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
Application.Run(new SplashForm());
}
}
Solution 1:
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.