设计启动屏幕
*********************************************************
版权声明:
此文章是本人正在撰写之.NET 4.0著作中的一部分,出于技术共享与交流目的而发布,作者金旭亮拥有全部版权。任何人及机构不得将其用于商业用途,如收费培训及出版同类技术书籍,有这方面需求的个人及培训机构请与本人直接联系。
本人联系方式:
JinXuLiang@bit.edu.cn 北京理工大学计算机学院 100081
更多技术与学习资源请关注作者博客:
http://blog.csdn.net/bitfan
金旭亮
2009.8.26
*************************************************************************
许多大家熟知的应用程序都有启动屏幕(另一常见称呼为“启动窗体”),比如Word在启动时就会先呈现一张图片,然后再显示主窗体。
另外一些应用程序具有更复杂的功能的启动窗体,比如著名的PhotoShop软件在启动屏幕上会动态扫描并装载用户安装的各种插件,并在启动窗体上显示出相关信息。
在这一小节中,我们将介绍两种类型的启动屏幕:一种似于Word,仅快速显示一张图片以通知用户“程序已经运行,请稍候……”,另一种则类似于PhotoShop,在显示启动屏幕的同时,程序会在后台进行系统初始化。
第一种方式的启动屏幕非常易于实现,甚至简单到不用写一行代码。
第二种方式则比较复杂一些,详细分析一下:
这种类型的应用程序在程序初起时都有两个线程,一个是主线程,通常负责在完成所有的系统初始化工作后显示主窗体,而启动屏幕则由另一线程负责创建并显示,通常要求将主线程所执行系统初始化的信息显示在启动屏幕上,很明显,这是一个两个线程同步及跨线程访问可视化控件的问题。如果读者阅读了本书前面的章节,则在这儿解决这个问题已没有任何难度,但仍然需要有一些技巧。
1在程序启动时显示一张图片
这是最容易实现的一种启动屏幕。只要安装了.NET Framework 3.5 SP1以上的版本,可以不需要写一句代码。其步骤如下:
1 在Visual Studio 2008 SP1或Visual Studio 2010中将启动屏幕图片加入到项目中。
2 设定此图片的“Build Action”属性为“SplashScreen”(图 1):

图1 为启动屏幕图片文件设置“Build Action”
编译并运行程序,可以看到你所选择的图片在屏幕上显示约0.5秒后自动消失,程序主窗体出现。
2 多功能程序启动屏幕的实现
请看示例程序SplashScreenForWPF,程序运行时如图2所示:

图2 启动屏幕
此示例程序在运行时启动了两个线程:主线程和UI线程,这两个线程所完成的工作如图3所示:

图3 两个线程的任务流程图
图3中,双向箭头表示这两个线程的这两个处理工作之间存在着线程同步关系。下面简要叙述一下示例程序中的技术关键点。
使用Visual studio创建WPF应用程序时,默认情况下会生成一个App.xaml和App.xaml.cs作为程序的入口点,但如果要显示启动屏幕,就不能使用它来启动程序了。
首先删除这两个文件,然后,向项目中添加一个Program.cs类文件,此文件与Visual studio为控制台应用程序生成的结构一样,也是在Program类中放置一个Main()函数作为程序入口点。
双击“解决方案资源管理器”中项目节点下的“Properties”节点,在打开的项目属性卡片中设置程序的启动对象为Program类,这将确保程序从Main()函数开始执行。
下面向项目中添加一个将作为启动屏幕的窗体,可以根据你的美术天份自行设计,在本示例中,我就放了一个背景图片,一个TextBlock用于显示文字信息,一个ProgressBar用于显示工作进度。
很重要的,由于启动屏幕的窗体需要被主线程访问,因此,需要给其添加一个公有的方法用于显示外部传过来的信息
public void ShowProgress(int Value)
{
pgbProcess.Value = Value;
tbInfo.Text ="已完成"+ Value.ToString() + "%";
}
所有的关键工作由运行于主线程中的Main()函数完成。
[STAThread]
static void Main()
{
//在一个独立UI线程中显示启动屏幕
Thread th = new Thread(ShowSplashScreenThenMainWindow);
th.SetApartmentState(ApartmentState.STA);
th.Start();
//启动初始化过程
SystemInit();
}
注意需要设置线程模式为STA,这是为了与Windows Form相兼容而一直沿用下来的。
上述代码中的线程函数ShowSplashScreenThenMainWindow()负责创建启动屏幕和显示主窗体:
static winSplash win = null; //引用启动屏幕对象
static void ShowSplashScreenThenMainWindow()
{
win = new winSplash();
win.ShowDialog();
//显示主窗体
Application myApp = new Application();
myApp.Run(new winMain());
}
注意上述代码中通过调用ShowDialog()方法显示启动屏幕并阻塞当前UI线程的进一步执行。
主线程在启动UI线程之后,调用SystemInit()方法开始系统初始化过程,在此可以放置各种初始化代码,然后使用win.Dispatcher.Invoke和BeginInvoke方法在启动屏幕上显示信息。
这里面的关键之处在于,SystemInit()方法在执行时必须确保启动屏幕窗体已经显示并可以接收外界传入的信息,为此,示例程序设置了一个ManualResetEvent对象作为线程同步对象,并将其初始化为non-singaled状态:
public static ManualResetEvent mre = new ManualResetEvent(false);
在SystemInit()方法的开头,调用
mre.WaitOne();
阻塞等待通知。
而在启动屏幕的Loaded事件(它表示窗体已初始化完成)中触发ManualResetEvent对象的状态转换:
private void Window_Loaded(object sender, RoutedEventArgs e)
{
//通知主线程自己已经启动完毕
Program.mre.Set();
}
当系统初始化完成,SystemInit()方法再通过win.Dispatcher.BeginInvoke方法向UI线程提交一个“关闭启动屏幕”的工作项请求,从而导致UI线程关闭启动屏幕,进而创建应用程序主窗体并显示,应用程序就可以被用户所访问了。
上面就是本示例的所有技术关键点,其余的技术细节请自行阅读源码。
这个示例采用WPF开发,但其中所介绍的技巧完全可用于Windows Form。笔者开发了对应的Windows Form,其示例项目名为SplashScreenForWinForm,供读者参考。
===============================
下载本文示例源码和PDF文档
(注:给的示例项目为VS2010格式,使用VS2008的读者请新建一个空白的Windows Form或WPF项目,然后手工向其中追加文件)。
分享到:
相关推荐
1. **创建启动屏幕资源**:首先,你需要一个设计启动屏幕的图像,例如BMP格式的位图文件。在VC中,可以通过Resource Editor(资源编辑器)将该图像添加到项目中,作为位图资源。确保选择合适的尺寸和色彩模式,以...
接下来,你需要设计启动屏幕的界面。这包括设置窗体的大小、颜色、背景图片等属性。你可以通过设计视图中的属性窗口来调整这些设置。例如,可以设置窗体的BackgroundImage属性为你的应用logo,调整SizeMode以适应...
1. **用户界面设计**:首先,你需要设计启动屏幕的UI,这包括颜色方案、logo、文字等元素。可以使用图形设计工具如Adobe Photoshop或免费的在线工具来完成。 2. **编程实现**:在编程中,通常用消息循环和线程管理...
本文将深入探讨如何使用易语言来禁止或启动屏幕保护,以及涉及到的关键函数`SystemParametersInfo`。 首先,屏幕保护程序是计算机系统为了防止显示器长时间静止显示同一画面而设计的功能,它可以防止屏幕烧伤。在...
在iOS开发中,Splash Screen(启动屏幕)是用户打开应用程序时首先看到的界面,它通常显示应用程序的品牌标识或一些...通过研究源码,我们可以学习到如何有效地管理和设计启动屏幕,同时掌握如何优化应用的启动流程。
2. 设计启动屏幕:在新建的项目中,打开"Form1",这就是我们的启动屏幕。可以添加图片、文本或其他控件以显示品牌信息。记得设置窗体的大小、位置和背景色以达到预期效果。如果需要动画效果,可以利用Timer控件和...
本文将详细介绍如何启动屏幕保护程序,并提供一个实例源码供参考。 在Windows系统中,启动屏幕保护程序主要有以下几种方法: 1. **手动启动**:用户可以通过简单地按下键盘上的`Win+L`组合键快速启动屏幕保护程序...
2. **设计UI**:设计启动屏幕的布局,可以是静态图片、动态加载的logo,或者是带有动画效果的界面。 3. **加载逻辑**:在Splash Activity中添加代码来执行必要的初始化操作,如检查更新、读取配置文件、加载数据等...
- 使用Interface Builder:在Xcode中,可以通过Interface Builder设计启动屏幕,它可以是静态图像,也可以是Storyboard,包含简单的UI元素和布局。 - 动态启动屏幕:对于更复杂的动画效果,可以使用Swift代码实现...
"启动屏幕保护.rar"的描述中多次提及“启动屏幕保护”,可能意味着这个程序在安装后会自动应用为默认的屏幕保护,或者具备特殊的功能,比如自动启动、定时启动等。不过,具体功能需要解压并安装后才能详细了解。 ...
你可以在这里设计启动屏幕的布局、颜色、图片和其他视觉元素。 3. **Storyboard**:启动屏幕通常在Storyboard中定义,它是iOS应用界面设计的一种方式,通过它可以实现界面间的跳转和动画效果。 4. **Auto Layout**...
【Android启动屏幕库-Splashy】是一个专门为Android平台设计的开源项目,旨在帮助开发者轻松创建具有高度定制性和吸引力的启动屏幕。使用Splashy库,你可以为你的应用添加各种酷炫的动画效果,提升用户体验,同时...
"CBZSplashView"库设计用于Appcelerator Titanium项目,目的是提供一个优雅、自定义化的启动屏幕体验。启动屏幕在应用程序启动时显示,通常包含品牌标识或应用程序的欢迎界面,旨在提高用户体验并减少用户等待应用...
在"Splashmrevised"项目中,开发者可能使用了GUIDE来设计启动屏幕的布局,包括图像、文本、按钮等元素的位置和样式。此外,也可能利用自定义代码来增强GUI的功能。 2. **启动屏幕的实现**: "splash.m"文件可能是...
本资源包提供了VS2010格式的两个示例项目,分别展示如何在WPF和Windows Form中结合多线程开发Windows桌面应用程序的启动屏幕。资源包中包含一个PDF文档对代码进行详细分析。 与作者交互请访问...
本主题聚焦于如何利用易语言编写代码来控制计算机的屏幕保护程序,包括禁止和启动屏幕保护。下面我们将深入探讨相关知识点。 首先,了解屏幕保护程序的作用是必要的。屏幕保护程序设计的初衷是为了防止显示器长时间...
设计启动屏幕时,需要注意避免过长的显示时间,以免让用户感到等待的不耐烦。 2. 主界面(Home Screen) 主界面是用户与应用进行交互的主要入口,它展示了应用的核心功能。主界面的设计应简洁明了,易于理解,同时...
总之,安卓启动屏幕不仅是技术层面的操作系统启动过程,还涉及到用户界面的设计和用户体验。理解这一流程以及如何对其进行定制,对于开发者和用户来说都具有重要意义。通过调整启动过程的各个阶段,可以优化系统性能...
标题中的“Adobe_Home_Screen_FIX_v3.5.6启动屏幕修复工具”指的是一个专门针对Adobe软件的启动屏幕出现问题而设计的修复程序。这个工具的版本号为3.5.6,通常软件的版本更新意味着修复了之前版本的错误或增加了新...
"自启动全能屏幕锁"是一款专为服务器管理设计的安全软件,其主要功能是提供强大的屏幕锁定保护,确保在无人值守时服务器的安全性。这款工具在启动后能够自动锁定屏幕,防止未经授权的人员进行操作,从而保护服务器上...