对于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意识到了该问题并把它解决了。
posted on 2005-05-09 23:01  enjoy .net  阅读(938)  评论(0编辑  收藏  举报