[转]WinForm下Splash(启动画面)制作

本文转自:http://www.smartgz.com/blog/Article/1088.asp 

原文如下:

    本代码可以依据主程序加载进度来显示Splash。

    static class Program
    {
        /// <summary>
        /// 主程序的入口点在此设置,包括一些初始化操作,启动窗体等
        /// </summary>
        private static ApplicationContext context;
        [STAThread]      
        static void Main()
        {
            Application.EnableVisualStyles();                       //样式设置
            Application.SetCompatibleTextRenderingDefault(false);   //样式设置
            Splash sp = new Splash();                               //启动窗体
            sp.Show();                                              //显示启动窗体
            context = new ApplicationContext();
            context.Tag = sp;
            Application.Idle += new EventHandler(Application_Idle); //注册程序运行空闲去执行主程序窗体相应初始化代码
            Application.Run(context);
        }



        //初始化等待处理函数
        private static void Application_Idle(object sender, EventArgs e)
        {
            Application.Idle -= new EventHandler(Application_Idle);
            if (context.MainForm == null)
            {
                Main mw = new Main();
                context.MainForm =mw;
                mw.init();                                  //主窗体要做的初始化事情在这里,该方法在主窗体里应该申明为public
                Splash sp = (Splash)context.Tag;
                sp.Close();                                 //关闭启动窗体 
                mw.Show();                                  //启动主程序窗体
            }
        }
    }

        Splash窗体的相关属性设置:
        BackgroundImage:载入你想作为启动画面的图片;
        ControlBox:False;
        FormBorderStyle:None;
        ShowInTaskbar:False;
        StartPositon:CenterScreen.

[转] 
http://www.lordong.cn/blog/post/18.html 
当程序在启动过程中需要花一些时间去加载资源时,我们希望程序能显示一个欢迎界面,能简单介绍软件功能的同时还能告知用户该程序还在加载中,使得用户体验更友好。 
实现如下: 

1. 添加欢迎界面的窗体(比如SlpashForm),做以下调整: 
将FormBorderStyle属性设成None,即没有窗体边框 
将StartPosition属性设成CenterScreen,即总是居中 
将TopMost属性设成True,即总是在顶部 
将UseWaitCursor属性设成Ture,即显示等待光标,让人感觉后台还在运行 
增加一个PictureBox控件,与欢迎图片大小一致,窗体的大小也设成一致 
增加一个ProgressBar控件,将Style设成Marquee,将MarqueeAnimationSpeed设成50 

2. 主界面的构造函数改成以下代码: 

// Create thread to show splash window 
Thread showSplashThread = new Thread(new ThreadStart(ShowSplash)); 
showSplashThread.Start(); 

// Time consumed here 
InitializeFrame(); // 把原来构造函数中的所有代码移到该函数中 

// Abort show splash thread 
showSplashThread.Abort(); 
showSplashThread.Join(); // Wait until the thread aborted 
showSplashThread = null; 

3. 显示SplashForm的线程函数 
/// 
/// Thread to show the splash. 
/// 
private void ShowSplash() 
{ 
SplashForm sForm = null; 
try 
{ 
sForm = new SplashForm(); 
sForm.ShowDialog(); 
} 
catch (ThreadAbortException e) 
{ 
// Thread was aborted normally 
if (_log.IsDebugEnabled) 
{ 
_log.Debug("Splash window was aborted normally: " + e.Message); 
} 
} 
finally 
{ 
sForm = null; 
} 
} 


4. 在主窗体的Load事件加激活自己的代码 
SetForegroundWindow(Process.GetCurrentProcess().MainWindowHandle); 

在使用SetForegroundWindow之前先声明一下 
// Uses to active the exist window 
[DllImport("User32.dll")] 
public static extern void SetForegroundWindow(IntPtr hwnd);   


http://www.cnblogs.com/hcfalan/archive/2006/09/13/502730.html

对于需要加载很多组件的应用程序来说,在启动的时候会非常的缓慢,可能会让用户误以为程序已经死掉,这显然不是我们希望看到的。如果能够在启动的时候动态的给用户一些反馈信息(比如当前正在加载的项),那么就可以有效的避免这一问题,并且可以给我们的应用程序增色不少。下边的图片是此代码的效果图。
 
下面是部分代码:
AppStart 类,包含Main方法
public class AppStart
{
    public AppStart()
    {
    }
    [STAThread]
    static void Main(string[] args)
    {
        //    显示Splash窗体
        Splash.Show();

        DoStartup(args);

        //    关闭Splash窗体
        Splash.Close();
    }

    static void DoStartup(string[] args)
    {
        //    做需要的事情
        frmMain f = new frmMain();
        Application.Run(f);
    }
}

Splash功能类:
public class Splash
{
    static frmSplash MySplashForm = null;
    static Thread MySplashThread = null;

    static void ShowThread() 
    {
        MySplashForm = new frmSplash();
        Application.Run(MySplashForm);
    }

    static public void Show() 
    {
        if (MySplashThread != null)
            return;

        MySplashThread = new Thread(new ThreadStart(Splash.ShowThread));
        MySplashThread.IsBackground = true;
        MySplashThread.ApartmentState = ApartmentState.STA;
        MySplashThread.Start();
    }

    static public void Close() 
    {
        if (MySplashThread == null) return;
        if (MySplashForm == null) return;

        try 
        {
            MySplashForm.Invoke(new MethodInvoker(MySplashForm.Close));
        }
        catch (Exception) 
        {
        }
        MySplashThread = null;
        MySplashForm = null;
    }

    static public string Status 
    {
        set 
        {
            if (MySplashForm == null) 
            {
                return;
            }

            MySplashForm.StatusInfo = value;
        }
        get 
        {
            if (MySplashForm == null) 
            {
                throw new InvalidOperationException("Splash Form not on screen");
            }
            return MySplashForm.StatusInfo;
        }
    }
}

Splash 界面类:

public class frmSplash : System.Windows.Forms.Form
{
    private string _StatusInfo = "";
    
    public frmSplash()
    {
        InitializeComponent();
    }

    private void InitializeComponent()
    {
        // 
        this.pictureBox1.Image = ((System.Drawing.Image)(resources.GetObject("pictureBox1.Image")));        
        //

    }

    public string StatusInfo 
    {
        set 
        {
            _StatusInfo = value;
            ChangeStatusText();
        }
        get 
        {
            return _StatusInfo;
        }
    }

    public void ChangeStatusText() 
    {
        try 
        {
            if (this.InvokeRequired) 
            {
                this.Invoke(new MethodInvoker(this.ChangeStatusText));
                return;
            }

            labStatus.Text = _StatusInfo;
        }
        catch (Exception e) 
        {
            //    异常处理
        }
    }
}

主界面类:

public class frmMain : System.Windows.Forms.Form
{
    public frmMain()
    {
        InitializeComponent();

    Splash.Status = "状态:载入初始化模块";
            System.Threading.Thread.Sleep(1000);
            
    Splash.Status = "状态:载入管理模块";
            System.Threading.Thread.Sleep(1000);

    Splash.Status = "状态:载入打印模块";
            System.Threading.Thread.Sleep(1000);

    Splash.Status = "状态:载入插件模块";
            System.Threading.Thread.Sleep(1000);

    Splash.Status = "状态:连接数据库";
            System.Threading.Thread.Sleep(1000);

    Splash.Close();
    }
}
原文地址:https://www.cnblogs.com/lxGIS/p/3729190.html