SplashScreen

看到有人提起,就想动手做做。可能要花两天时间,因为时间是零零碎碎的。
哎,很多常用的东西,在2005版已经有了。当初看到好多人写基于2003的控件,这2005一出哪,全都没用了。心血白费了。这微软未免也太缺德了。应该说,2003.NET的试用版,到了2005才算是正式版吧。或许基于2005的自写控件、组件寿命会长一些。否则,不骂娘才怪。
现在写写,也算是练练习吧。

溅射屏幕,即SplashScreenForm,有以下特点:
首先,程序是主窗体程序;
其次,SplashScreenForm在主窗体加载完毕后退出。

一般来说,SplashScreenForm比较简洁,窗体的内容只是显示程序主题、版权等信息;复杂些的,显示主程序的加载项目情况。
微软的SplashScreenForm向来简洁,Adobe的复杂些,就画窗体也花了一番心思。以下做的,以微软的作标准。

按照功能实现与界面分离的原则,这个类当然不能依赖于某个特定的SplashScreenFormMainForm。参考了.NET2005的做法,继承了System.Windows.Forms.ApplicationContext做了一个SplashScreenApplicationContextClass基类。具体使用时,再继承这个类赋与特定参数,交Application.Run(ApplicationContext)来运行。因为基础知识不好,好多东西只知道用而不知为什么这样用,免不了的会出现这样那样的问题,请指正。

总体思路是:溅射屏幕显示的同时加载主窗体,主窗体加载完毕后关闭溅射屏幕,程序交给主窗体。溅射屏幕显示的时间由两个因素决定,一个是事前设定的溅射屏幕显示的时间,一个是主窗体加载所需要的时间,实际显示时间是两者中的最大值。

     SplashScreenApplicationContextClass
为什么要做为基类设计并要实现?主要考虑到主窗体在初始化时就需要时间,Sub New()是需要时间的,并非所有的程序都将初始事项放到Load()里头。


类:

Imports System.Windows.Forms
Imports System.Threading
PublicMustInheritClass SplashScreenApplicationContextClass
Inherits System.Windows.Forms.ApplicationContext

Private _SplashScreenForm As Form
Private _SplashScreenTimer As System.Timers.Timer
Private _SplashScreenTimerInterVal AsInteger = 5000
Private _MainFormFinshLoad AsBoolean = False
Private _MainFormWindowState As Windows.Forms.FormWindowState
Private _CloseSplashScreen AsBoolean = False

PrivateDelegateSub DisposeDelegate()

ProtectedWriteOnlyProperty SplashScreenForm() As Form
Set(ByVal Value As Form)
Me._SplashScreenForm = Value
EndSet
End Property

ProtectedWriteOnlyProperty SecondsShow() AsInteger
Set(ByVal Value AsInteger)
If Value <> 0 Then
Me._SplashScreenTimerInterVal = 1000 * Value
EndIf
EndSet
End Property


SubNew()

Me.ShowSplashScreen()
Me.MainFormLoad()

End Sub

PrivateSub DoEvents()
        Application.DoEvents()
End Sub

ProtectedMustOverrideSub OnCreateSplashScreenForm()

ProtectedMustOverrideSub OnCreateMainForm()

ProtectedMustOverrideSub SetSeconds()

PrivateSub ShowSplashScreen()
Me.SetSeconds()
Me.OnCreateSplashScreenForm()
Me._SplashScreenTimer = New System.Timers.Timer(CType(Me._SplashScreenTimerInterVal, Double))
AddHandler _SplashScreenTimer.Elapsed, New System.Timers.ElapsedEventHandler(AddressOfMe.SplashScreenDisplayTimeUp)
Me._SplashScreenTimer.AutoReset = False
Dim DisplaySpashScreenThread AsNew Thread(New ThreadStart(AddressOfMe.DisplaySplashScreen))
        DisplaySpashScreenThread.Start()
End Sub

PrivateSub DisplaySplashScreen()
Me._SplashScreenTimer.Enabled = True
        Application.Run(
Me._SplashScreenForm)
End Sub

PrivateSub SplashScreenDisplayTimeUp(ByVal sender As System.Object, ByVal e As System.timers.ElapsedEventArgs)
Me._SplashScreenTimer.Dispose()
Me._SplashScreenTimer = Nothing
Me._CloseSplashScreen = True
End Sub

PrivateSub MainFormLoad()
Me.OnCreateMainForm()
        _MainFormWindowState = 
Me.MainForm.WindowState '保存主窗体状态
Me.MainForm.WindowState = FormWindowState.Normal 'Normal情形下,主窗体会Show出来
AddHandlerMe.MainForm.Load, New EventHandler(AddressOfMe.MainFormLoadingDone)
End Sub

PrivateSub MainFormLoadingDone(ByVal sender AsObjectByVal e As EventArgs)
RemoveHandlerMe.MainForm.Load, New EventHandler(AddressOfMe.MainFormLoadingDone)
DoWhileNotMe._CloseSplashScreen
Me.DoEvents()
Loop
Me.HideSplashScreen()
End Sub

PrivateSub HideSplashScreen()
        MainFormActivate()
'先激活主窗体再关闭启动窗体,是为了保证程序为当前活动程序
Dim SplashScreenFormDisposeDelegate As DisposeDelegate = New DisposeDelegate(AddressOfMe._SplashScreenForm.Dispose)
Me._SplashScreenForm.Invoke(SplashScreenFormDisposeDelegate)
Me._SplashScreenForm = Nothing
End Sub

PrivateSub MainFormActivate()
If _MainFormWindowState = FormWindowState.Minimized Then _MainFormWindowState = FormWindowState.Normal
IfMe.MainForm.WindowState <> _MainFormWindowState ThenMe.MainForm.WindowState = _MainFormWindowState
Me.MainForm.Activate()
End Sub
End Class



使用:(SplashScreenForm我还是随便用一个Form来代替)

PublicClass App

PublicSharedSub Main()
Dim t AsNew MyContext
        Application.Run(t)
End Sub

End Class

PublicClass MyContext
Inherits SplashScreenApplicationContextClass

ProtectedOverridesSub OnCreateMainForm()
Me.MainForm = New Form2
End Sub

ProtectedOverridesSub OnCreateSplashScreenForm()
Me.SplashScreenForm = New Form1
End Sub

ProtectedOverridesSub SetSeconds()
Me.SecondsShow = 3 '显示3,若是0则取默认值5
End Sub

End Class

 

 

你可能感兴趣的:(SplashScreen)