Carlos Blanco
Carlos Blanco

Reputation: 8772

SplashScreen and custom messages

Is it possible to use the SplashScreen class in .Net to show dynamic messages while my application is loading?

Something like.
Module one loaded...
Module two loaded...
and so on.

Upvotes: 0

Views: 748

Answers (2)

MoonKnight
MoonKnight

Reputation: 23831

You can do this using 'System.Theading'. The following code launches a "splash screen" on a separate thread whilst your application (in my example below it is called MainForm()) loads or initialises. Firstly in your "main()" method (in your program.cs file unless you have renamed it) you should show your splash screen. This will be a WinForm or WPF form that you wish to show the user at start up. This is launch from main() as follows:

    [STAThread]
    static void Main()
    {
        // Splash screen, which is terminated in MainForm.       
        SplashForm.ShowSplash();

        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);

        // Run UserCost.
     Application.Run(new MainForm());
    }

In your SplashScreen code you need something like the following:

public partial class SplashForm : Form
{

    // Thredding.
    private static Thread _splashThread;
    private static SplashForm _splashForm;    

    public SplashForm()
    {
        InitializeComponent();
    }

    // Show the Splash Screen (Loading...)      
    public static void ShowSplash()    
    {        
        if (_splashThread == null)        
        {            
            // show the form in a new thread            
            _splashThread = new Thread(new ThreadStart(DoShowSplash));            
            _splashThread.IsBackground = true;            
            _splashThread.Start();        
        }    
    }    

    // Called by the thread    
    private static void DoShowSplash()    
    {        
        if (_splashForm == null)            
            _splashForm = new SplashForm();        
        // create a new message pump on this thread (started from ShowSplash)        
        Application.Run(_splashForm);
    }    

    // Close the splash (Loading...) screen    
    public static void CloseSplash()    
    {        
        // Need to call on the thread that launched this splash        
        if (_splashForm.InvokeRequired)            
            _splashForm.Invoke(new MethodInvoker(CloseSplash));        
        else            
            Application.ExitThread();    
    }

}

This launches the splash form on a separate background thread allowing you to proceed with the rendering of your main application simultaneously. To display messages about loading you will have to pull information from the main UI thread, or work in purely aesthetic nature. To finish off and close the splash screen down when your application has been initialised you place the following inside the default constructor (you could overload the constructor if you wanted to):

    public MainForm()
    {
        // ready to go, now initialise main and close the splashForm. 
        InitializeComponent();
        SplashForm.CloseSplash();
    }

The code above should be relatively easy to follow.

I hope this helps.

Upvotes: 2

Vlad
Vlad

Reputation: 35594

No, you need to code this functionality yourself. The built-in splash screen can only show a static image.

Upvotes: 2

Related Questions