本文转自: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(); } }