对于Splash Screen的改进
上一次谈到的Splash Screen解决方案可以很好地显示一个Splash Screen,并且通过Splash Screen上的Timer控件指定Splash Screen的显示时间。但是这个解决方案存在一个问题,即Splash Screen在显示过程中不能同时执行主窗体的初始化工作,即使代码这样写也不行:
Public Sub New()
MyBase.New()
Me.Cursor = Cursors.AppStarting
Dim frm As New SplashForm
frm.FormBorderStyle = FormBorderStyle.None
frm.MaximizeBox = False
frm.MinimizeBox = False
frm.StartPosition = FormStartPosition.CenterScreen
frm.ControlBox = False
frm.ShowInTaskbar = False
frm.ShowDialog()
'该调用是 Windows 窗体设计器所必需的。
InitializeComponent()
'在 InitializeComponent() 调用之后添加任何初始化
'
'加载图书类型至TreeView
PopulateBookType()
Me.Cursor = Cursors.Default
End Sub
如果SplashForm的Timer设定为5秒钟,那么在SplashForm显示的5钟内程序将停止在frm.ShowDialog()处,而不能执行下面的主窗体初始化代码。
一个比较好的解决方案就是使用Thread,这里SplashForm保持不变,需要增加一个SplashFormContainer类用以实现线程操作,显示和隐藏SplashForm,代码如下:
Imports System.Threading
'SplashForm包装类,用于实现
'线程操作
'显示/隐藏SplashForm
Public Class SplashFormContainer
Private m_thr As Thread
Private m_splashform As SplashForm
Sub New()
m_thr = New Thread(AddressOf Show)
m_thr.Start()
End Sub
Private Sub Show()
m_splashform = New SplashForm
m_splashform.ShowDialog()
End Sub
Public Sub Close()
m_thr.Join()
End Sub
End Class
另外主窗体需要作如下修改:
Dim splashContainer As SplashFormContainer
Public Sub New()
MyBase.New()
'显示Splash Screen
Dim splashContainer = New SplashFormContainer
'该调用是 Windows 窗体设计器所必需的。
InitializeComponent()
'在 InitializeComponent() 调用之后添加任何初始化
'加载图书类型至TreeView
PopulateBookType()
Me.StartPosition = FormStartPosition.CenterScreen
Thread.Sleep(1000)
'关闭Splash Screen
splashContainer.Close()
Me.Cursor = Cursors.Default
End Sub
总结:
通过线程的使用可以实现在SplashForm显示的同时,完成窗体初始化的工作。
VB.Net 2005中提供了对Splash Screen的内置支持,看来有不少人遇到了同样的问题,并且Microsoft意识到了该问题并把它解决了。
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](/Images/OutliningIndicators/None.gif)
一个比较好的解决方案就是使用Thread,这里SplashForm保持不变,需要增加一个SplashFormContainer类用以实现线程操作,显示和隐藏SplashForm,代码如下:
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
另外主窗体需要作如下修改:
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
总结:
通过线程的使用可以实现在SplashForm显示的同时,完成窗体初始化的工作。
VB.Net 2005中提供了对Splash Screen的内置支持,看来有不少人遇到了同样的问题,并且Microsoft意识到了该问题并把它解决了。
![](/Emoticons/emteeth.gif)