您的位置:首页 > 编程语言 > C#

C#启动窗体的制作—基于线程技术实现

2011-08-14 12:54 411 查看
最近在做一个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截图:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: