5,661,954 members and growing! (15,059 online)
Email Password   helpLost your password?
General Programming » Macros and Add-ins » VS.NET Addins     Beginner

Use a splash screen in your application

By cncxz

This article will show you how to display a splash screen during application initialization using C# in VS2005
C#, Windows, .NET, Visual Studio, Dev

Posted: 12 Jul 2006
Updated: 12 Jul 2006
Views: 33,220
Bookmarked: 77 times
Announcements
Loading...



Search    
Advanced Search
Sitemap
28 votes for this Article.
Popularity: 6.61 Rating: 4.56 out of 5
1 vote, 3.6%
1
0 votes, 0.0%
2
0 votes, 0.0%
3
7 votes, 25.0%
4
20 votes, 71.4%
5

Sample Image - usesplashscreen.jpg

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

  1. Create a Windows Forms project Named SplashScreen
  2. Delete Form1.cs
  3. 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;

        /// <summary>

        /// Show the SplashForm

        /// </summary>

        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();
        }

        /// <summary>

        /// set the loading Status

        /// </summary>

        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 }
                    );
            }

        }

        /// <summary>

        /// Close the SplashForm

        /// </summary>

        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.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

About the Author

cncxz



Location: China China

Other popular Macros and Add-ins articles:

Article Top
Sign Up to vote for this article
You must Sign In to use this message board.
FAQ FAQ Noise ToleranceSearch Search Messages 
 Layout  Per page   
 Msgs 1 to 25 of 25 (Total in Forum: 25) (Refresh)FirstPrevNext
GeneralBugmemberSimon Stevens0:19 19 Jun '08  
Generalproblem with ApartmentState.STAmemberOssan Dust0:24 21 May '08  
Newsuse Opacity attribute when m_SplashForm is closingmemberwangkuang55:53 5 Mar '08  
GeneralExcellent work!memberAlan Yost11:25 30 Nov '07  
GeneralBug [modified]membertranbagu22:21 25 Oct '07  
GeneralRe: Bug -> solutionmemberchr.dev3:25 16 Nov '07  
GeneralRe: Bug -> solutionmemberwangkuang54:45 7 Mar '08  
Generalnice!memberradioman@gawab.com22:49 6 Aug '07  
GeneralREALLY GREAT !memberlucatoldo2:27 18 Jun '07  
GeneralAdd new operation during the splashmemberayeleteric20:44 10 Jun '07  
GeneralGreat example!memberDVroegop4:53 13 Apr '07  
GeneralThanksmember12:03 20 Mar '07  
GeneralAdding more "static" labels.memberCMercs6:55 14 Feb '07  
Generalvb.net versionmemberGreg Hazzard11:17 7 Nov '06  
GeneralRe: vb.net versionmemberGreg Hazzard11:37 9 Nov '06  
GeneralRe: vb.net versionmembercncxz22:35 4 Feb '07  
QuestionTopMost propertymembermarutj17:09 2 Oct '06  
GeneralfrmMain does not appear in the ForegroundmemberZupcoder14:17 9 Sep '06  
GeneralRe: frmMain does not appear in the ForegroundmemberAllad21:33 11 Jan '07  
Questionthe splash won't disappearmemberUnruled Boy22:38 13 Aug '06  
GeneralVB version of this code?memberJoshua Ng23:30 18 Jul '06  
GeneralRe: VB version of this code? [modified]membercncxz0:53 19 Jul '06  
GeneralRe: VB version of this code?memberJoshua Ng21:22 19 Jul '06  
GeneralUsage of the splash screenmemberbaruchl22:34 17 Jul '06  
GeneralRe: Usage of the splash screenmembercncxz1:55 18 Jul '06  

General General    News News    Question Question    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

PermaLink | Privacy | Terms of Use
Last Updated: 12 Jul 2006
Editor: Deeksha Shenoy
Copyright 2006 by cncxz
Everything else Copyright © CodeProject, 1999-2008
Web12 | Advertise on the Code Project