5
votes

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());
    }
}
1
Can you show the code that creates this form? Where is the pbcarrega initialized? - Paul Sasik
pbcarrega is the name of the ProgressBar - Leandro Mont
This code is the code of the Form Splash Screen,but you want to know about the Form Main ? - Leandro Mont
@Novatec - You need to provide us with enough code for us to recreate your problem. Just picking a few lines of code that you think is relevant is not enough. Please post the minimal, complete, and verifiable code to replicate your problem. - Enigmativity
I posted now the part of the Form Main,I was looking and I think I did something wrong in that part of Application.Run() - Leandro Mont

1 Answers

16
votes

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

  1. Add a reference of Microsoft.VisualBasic.dll to your project.
  2. Create a MyApplication class by deriving from WindowsFormsApplicationBase
  3. override OnCreateMainForm and assign the from that you want to be the startup form to MainForm property.
  4. Override OnCreateSplashScreen and assign the form that you want to show as splash screen to SplashScreen property.

  5. In your Main method, create an instance of MyApplication and call its Run 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.