水如烟

                 顺其自然,水到渠成 LzmTW

文或代码皆是面向初学者.我是爱好者,也是初学者.那些"文章",只按自己理解写,我是不知术语名词的.所以只供参考,也仅供参考.

导航

Author:水如烟

     由于MSDN中文文档还没出来,不晓得那些名词怎叫法,所以不说多了,贴代码和图象(我将操作的步骤一并说了)。
     MS2005自带的SplashScreenForm少了一项功能,就是主窗体在加载项目时若时间较长,不能把信息显示在启动窗体中。我主要的想实现这个。
     项目涉及到线程消息的传递,这方面我不懂。功能是实现了,为什么那样做,我也不明白。好了,开始。

     首先建一个工程LzmTW.ApplicationBase,输出为Class Libary。我的SplashScreenForm好简单。如图:
 
上面项目中有两个关于About的文件,在另一文中介绍。

     文件SplashScreenMainFormLoadingItemHandler.vb只是定义一个委托。就一行:
Public Delegate Sub SplashScreenMainFormLoadingItemHandler(ByVal sender As ObjectByVal Message As String)

     文件SplashScreenMainFormLoadingClass.vb:
Public Class SplashScreenMainFormLoadingClass
    
Protected Friend Shared Event SplshScreenFormEvent As SplashScreenMainFormLoadingItemHandler

    
Private IsFirst As Boolean = True
    
Public Sub SendItemMessage(ByVal sender As ObjectByVal Message As String)
        System.Threading.Thread.Sleep(
0)
        
If IsFirst Then
            
RaiseEvent SplshScreenFormEvent(NothingNothing)
            IsFirst 
= False
        
End If
        
RaiseEvent SplshScreenFormEvent(sender, Message)
    
End Sub
End Class

     下面看SplashScreenForm,它由三个文件组成。单击Solution Explorer的Show All Files按钮。显示如下:

     资源文件SplashScreenForm.resx这里不用管它。
     文件SplashScreenForm.designer.vb:
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Partial 
Class SplashScreenForm
    
Inherits System.Windows.Forms.Form

    
'Form overrides dispose to clean up the component list.
    <System.Diagnostics.DebuggerNonUserCode()> _
    
Protected Overrides Sub Dispose(ByVal disposing As Boolean)
        
If disposing AndAlso components IsNot Nothing Then
            components.Dispose()
        
End If
        
MyBase.Dispose(disposing)
    
End Sub


    
'Required by the Windows Form Designer
    Private components As System.ComponentModel.IContainer

    
'NOTE: The following procedure is required by the Windows Form Designer
    'It can be modified using the Windows Form Designer.  
    'Do not modify it using the code editor.
    <System.Diagnostics.DebuggerStepThrough()> _
    
Private Sub InitializeComponent()
        
Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(SplashScreenForm))
        
Me.ApplicationTitleLabel = New System.Windows.Forms.Label
        
Me.VersionLabel = New System.Windows.Forms.Label
        
Me.CopyRightLabel = New System.Windows.Forms.Label
        
Me.LoadingLabel = New System.Windows.Forms.Label
        
Me.SuspendLayout()
        
'
        'ApplicationTitleLabel
        '
        Me.ApplicationTitleLabel.BackColor = System.Drawing.Color.Transparent
        
Me.ApplicationTitleLabel.Font = New System.Drawing.Font("Microsoft Sans Serif"18.0!, System.Drawing.FontStyle.Bold)
        
Me.ApplicationTitleLabel.ForeColor = System.Drawing.SystemColors.ActiveCaption
        
Me.ApplicationTitleLabel.Location = New System.Drawing.Point(1277)
        
Me.ApplicationTitleLabel.Name = "ApplicationTitleLabel"
        
Me.ApplicationTitleLabel.Size = New System.Drawing.Size(36929)
        
Me.ApplicationTitleLabel.TabIndex = 0
        
Me.ApplicationTitleLabel.Text = "ApplicationTitle"
        
Me.ApplicationTitleLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter
        
'
        'VersionLabel
        '
        Me.VersionLabel.AutoSize = True
        
Me.VersionLabel.BackColor = System.Drawing.Color.Transparent
        
Me.VersionLabel.Font = New System.Drawing.Font("Microsoft Sans Serif"9.0!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0Byte))
        
Me.VersionLabel.ForeColor = System.Drawing.SystemColors.ActiveCaption
        
Me.VersionLabel.Location = New System.Drawing.Point(40176)
        
Me.VersionLabel.Name = "VersionLabel"
        
Me.VersionLabel.Size = New System.Drawing.Size(10115)
        
Me.VersionLabel.TabIndex = 1
        
Me.VersionLabel.Text = "版本: {0}.{1:00}"
        
'
        'CopyRightLabel
        '
        Me.CopyRightLabel.AutoSize = True
        
Me.CopyRightLabel.BackColor = System.Drawing.Color.Transparent
        
Me.CopyRightLabel.Font = New System.Drawing.Font("Microsoft Sans Serif"9.0!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0Byte))
        
Me.CopyRightLabel.ForeColor = System.Drawing.SystemColors.ActiveCaption
        
Me.CopyRightLabel.Location = New System.Drawing.Point(40191)
        
Me.CopyRightLabel.Name = "CopyRightLabel"
        
Me.CopyRightLabel.Size = New System.Drawing.Size(7215)
        
Me.CopyRightLabel.TabIndex = 2
        
Me.CopyRightLabel.Text = "CopyRight"
        
'
        'LoadingLabel
        '
        Me.LoadingLabel.AutoSize = True
        
Me.LoadingLabel.BackColor = System.Drawing.Color.Transparent
        
Me.LoadingLabel.Font = New System.Drawing.Font("Microsoft Sans Serif"9.0!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0Byte))
        
Me.LoadingLabel.ForeColor = System.Drawing.SystemColors.ActiveCaption
        
Me.LoadingLabel.Location = New System.Drawing.Point(39220)
        
Me.LoadingLabel.Name = "LoadingLabel"
        
Me.LoadingLabel.Size = New System.Drawing.Size(5915)
        
Me.LoadingLabel.TabIndex = 3
        
Me.LoadingLabel.Text = "Loading"
        
'
        'SplashScreenForm
        '
        Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 12.0!)
        
Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
        
Me.BackgroundImage = CType(resources.GetObject("$this.BackgroundImage"), System.Drawing.Image)
        
Me.ClientSize = New System.Drawing.Size(393241)
        
Me.ControlBox = False
        
Me.Controls.Add(Me.LoadingLabel)
        
Me.Controls.Add(Me.CopyRightLabel)
        
Me.Controls.Add(Me.VersionLabel)
        
Me.Controls.Add(Me.ApplicationTitleLabel)
        
Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle
        
Me.MaximizeBox = False
        
Me.MinimizeBox = False
        
Me.Name = "SplashScreenForm"
        
Me.ShowInTaskbar = False
        
Me.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen
        
Me.ResumeLayout(False)
        
Me.PerformLayout()

    
End Sub

    
Protected WithEvents ApplicationTitleLabel As System.Windows.Forms.Label
    
Protected WithEvents VersionLabel As System.Windows.Forms.Label
    
Protected WithEvents CopyRightLabel As System.Windows.Forms.Label
    
Protected WithEvents LoadingLabel As System.Windows.Forms.Label
End Class


     文件SplashScreenForm.vb:
Public Class SplashScreenForm
    
Private Delegate Sub SetTextCallback(ByVal [text] As String)

    
Private WithEvents MainFormLoadingClass As New SplashScreenMainFormLoadingClass

    
Protected Overridable Sub SplashScreenForm_Load(ByVal sender As ObjectByVal e As System.EventArgs) Handles Me.Load

        
If My.Application.Info.Title <> "" Then
            ApplicationTitleLabel.Text 
= My.Application.Info.Title
        
Else
            ApplicationTitleLabel.Text 
= System.IO.Path.GetFileNameWithoutExtension(My.Application.Info.AssemblyName)
        
End If

        VersionLabel.Text 
= System.String.Format(VersionLabel.Text, My.Application.Info.Version.Major, My.Application.Info.Version.Minor)
        CopyRightLabel.Text 
= My.Application.Info.Copyright
        LoadingLabel.Text 
= ""
    
End Sub


    
Private Sub OnLoadingItemChanged(ByVal sender As ObjectByVal Message As StringHandles MainFormLoadingClass.SplshScreenFormEvent
        
If Me.LoadingLabel.InvokeRequired Then
            
Dim d As New SetTextCallback(AddressOf SetLoadingLableText)
            
Me.Invoke(d, New Object() {Message})
        
Else
            SetLoadingLableText(Message)
        
End If
    
End Sub


    
Private Sub SetLoadingLableText(ByVal [text] As String)
        
Me.LoadingLabel.Text = [text]
    
End Sub


End Class

     将项目编译后,得到LzmTW.ApplicationBase.dll。下面是如何使用了。

     新建一个工程,选Windows Application。如下图:


     添加一个新项目,当然是指SplashScreenForm。这里选取Inherited Form,如图:


     单击Add,下一步单击Brow定位选取LzmTW.ApplicationBase.dll,出来一个项目选取对话框,如图:


     选取SpashScreenForm然后单OK。这样,工程多了一个Form2,如图:


     接下来是工程部署,怎么显示这个SplashScreen了。我还是将一些细节性的交待一番。说那么多,是基于我假定你也刚接触MS2005。
     双击(或右键Open)My Project,选取Application的Splash Screen为Form2,如图:


     现在可以运行程序了。可以看到SplashScreen显示2秒后再出来Form1主窗体。.NET2.0的WindowsFormsApplicationBase设置SplashScreen显示时间默认为2000毫秒。
     2秒的显示时间不足以让我来截图。下面,说说怎么重设它的显示时间。我改为20秒,方便截图。
     一样的Show All Files,打开My Project下Application.Designer.vb,在OnCreateSplashScreen()下添加代码:Me.MinimumSplashScreenDisplayTime = 20000,如图:


     现在重新运行程序,可以截到启动画面了。


     下面说说怎么显示主窗体的加载信息。
     先删去Me.MinimumSplashScreenDisplayTime = 20000那行代码。现在启动窗体的显示时间由主窗体加载项目的时间来决定了,当然,下面的做法令加载的时间超过2秒。右键点击Form1,选View Code.在Form1_Load添加代码。
Public Class Form1

    
Private Sub Form1_Load(ByVal sender As ObjectByVal e As System.EventArgs) Handles Me.Load
        
Dim SendMessage As New LzmTW.ApplicationBase.SplashScreenMainFormLoadingClass
        
For i As Integer = 999 To 0 Step -1
            SendMessage.SendItemMessage(
NothingString.Format("稍等,加载{0}中", i))
        
Next

        SendMessage.SendItemMessage(
NothingString.Format("稍等,正在加载{0}""数据集"))
        
Dim b As New DataSet
        
'.
        SendMessage.SendItemMessage(Nothing"加载完毕")
        
'停顿2秒,看看
        System.Threading.Thread.Sleep(2000)
    
End Sub

End Class

     效果如图。


     好了,全说完了。不足之处,敬请指出。