最近在做一个winform的GIS项目,想增加一个启动窗体。为了节约时间,到网上查了一圈,果然搜到一篇不错的博文。
这是原文的地址:http://www.cnblogs.com/hcfalan/archive/2006/09/13/502730.html#
其实原文已经说得很清楚了,我这里就说一下启动窗体界面设计中几个需要设置的地方:
1.Cursor属性设置为 WaitCursor ;
2.FormBorderStyle属性设置为 None ;
3.ShowInTaskbar属性设置为 False ;
4.StartPosition属性设置为 CenterScreen ;
下面是引用原文的部分(有些地方我加了注释):
先看效果图
下面是原文的代码部分:
AppStart 类,包含Main方法,是程序的入口点:
/// <summary>
/// 应用程序启动类
/// </summary>
public class AppStart
{
public AppStart()
{
}
/// <summary>
/// 程序入口函数
/// </summary>
/// <param name="args"></param>
[STAThread]
static void Main(string[] args)
{
//显示启动窗体
Splash.Show();
DoStartup(args);
//关闭启动窗体
Splash.Close();
}
/// <summary>
/// 做需要的事情
/// </summary>
/// <param name="args"></param>
static void DoStartup(string[] args)
{
//启动主窗体
frmMain myfrmMain = new frmMain();
Application.Run(myfrmMain);
}
}
Splash功能类,用于管理启动窗体的显示、关闭等:
/// <summary>
/// 启动窗体管理类
/// </summary>
public class Splash
{
static frmSplash mySplashForm = null;
static Thread mySplashThread = null;
/// <summary>
/// 运行启动窗体
/// </summary>
static void ShowThread()
{
mySplashForm = new frmSplash();
Application.Run(mySplashForm);
}
/// <summary>
/// 显示启动窗体
/// </summary>
static public void Show()
{
if (mySplashThread != null)
return;
//开辟一个线程,并启动
mySplashThread = new Thread(new ThreadStart(Splash.ShowThread));
mySplashThread.IsBackground = true;
mySplashThread.SetApartmentState(ApartmentState.STA);
mySplashThread.Start();
}
/// <summary>
/// 关闭启动窗体
/// </summary>
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;
}
/// <summary>
/// 启动窗体的状态信息
/// </summary>
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 partial class frmSplash : Form
{
private string _StatusInfo = ""; //状态信息
public frmSplash()
{
InitializeComponent();
}
/// <summary>
/// 状态信息属性
/// </summary>
public string StatusInfo
{
set
{
_StatusInfo = value;
ChangeStatusText();
}
get
{
return _StatusInfo;
}
}
/// <summary>
/// 改变状态信息标签的文本
/// </summary>
public void ChangeStatusText()
{
try
{
if (this.InvokeRequired)
{
this.Invoke(new MethodInvoker(this.ChangeStatusText));
return;
}
labStatus.Text = _StatusInfo;
}
catch (Exception e)
{
// 异常处理
}
}
}
主界面类,主界面后台代码:
public partial class frmMain : 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();
}
}
下面是我自己照着上面做的Demo截图: