首先新建一个Windows窗体项目 WindowsApplication1,并添加一个窗体Form2。把Form2的FormBorderStyle设为none,TopMost设为True,StartPosition设为CenterScreen,添加一个名为label1标签控件,给窗体加一个背景图片。
接下来新建一个代码文件CodeFile1.cs,添加如下代码:
using System;
using System.Windows.Forms;
using System.Threading;
using System.Reflection;
namespace WindowsApplication1
{
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>
/// 显示启动画面
/// </summary>
public static void Show(Type splashFormType)
{
if (m_SplashThread != null)
return;
if (splashFormType == null)
{
throw (new Exception("必须设置启动窗体"));
}
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>
/// 设置加载信息
/// </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>
/// 关闭启动画面
/// </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("启动窗体类型必须是System.Windows.Forms.Form的子类"));
}
if (m_SplashInterface == null)
{
throw (new Exception("启动窗体必须实现ISplashForm接口"));
}
if (!string.IsNullOrEmpty(m_TempStatus))
m_SplashInterface.SetStatusInfo(m_TempStatus);
}
private delegate void SplashStatusChangedHandle(string NewStatusInfo);
}
/// <summary>
/// 启动窗体接口
/// </summary>
public interface ISplashForm
{
void SetStatusInfo(string NewStatusInfo);
}
}
修改Form2.cs文件,结果如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace WindowsApplication1
{
public partial class Form2 : Form,ISplashForm
{
public Form2()
{
InitializeComponent();
}
void ISplashForm.SetStatusInfo(string NewStatusInfo)
{
label1.Text = NewStatusInfo;
}
}
}
接下来在Program.cs的
Application.Run(new Form1());
语句前加一句:
Splasher.Show(typeof(Form2));
给Form1.cs加几句套话,结果如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace WindowsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
Splasher.Status = "正在创建主窗体...";
System.Threading.Thread.Sleep(1000);
InitializeComponent();
Splasher.Status = "正在读取配置文件...";
System.Threading.Thread.Sleep(1000);
Splasher.Status = "正在***...";
System.Threading.Thread.Sleep(1000);
Splasher.Status = "正在启动...";
System.Threading.Thread.Sleep(1000);
Splasher.Close();
}
}
}
编译,运行,再把界面搞好看点就可以了。