注意:ここではVisual Studio 2005以降のVB.NETでスプラッシュウィンドウを表示する方法を紹介します。それ以外の場合は、「スプラッシュウィンドウを表示する」をご覧ください。
Visual Studio 2005以降のVB.NETであれば、Visual Basicアプリケーションモデルを使って、簡単にスプラッシュウィンドウを表示することができます。
以下にその手順を示します。
コマンドライン引数に"/nosplash"または"-nosplash"が指定されているときは、スプラッシュウィンドウが表示されません。
なお、このようにして表示されたスプラッシュスクリーンはメインスレッドとは別のスレッドで実行されるため、スプラッシュスクリーンとしたフォームにアクセスする際には注意が必要です。これに関しては、後述します。
My.Application.MinimumSplashScreenDisplayTimeプロパティにより、スプラッシュウィンドウを表示する最短時間(ミリ秒単位)を指定できます(デフォルトは、2秒です)。少なくともここで指定した時間だけスプラッシュウィンドウは表示されます。例えば、メインフォームのLoadイベントハンドラでの処理に時間がかかり、メインフォームが表示されるまでそれ以上の時間がかかるならば、スプラッシュウィンドウはメインフォームが表示されるまで消えません。
MinimumSplashScreenDisplayTimeプロパティは、MyApplicationクラスのOnInitializeメソッドをオーバーライドしたメソッド内で設定します。MyApplicationクラスの記述されたApplicationEvents.vbファイルを表示するには、プロジェクトプロパティの「アプリケーション」タブにある「アプリケーションイベントの表示」をクリックします。
補足:OnCreateSplashScreenメソッドをオーバーライドしたメソッドで設定することもできますが、OnCreateSplashScreenメソッドはVSのデザイナが自動生成するApplication.Designer.vbファイルでオーバーライドされるため(ここでスプラッシュスクリーンの設定が行われる)、ApplicationEvents.vbではOnInitializeメソッドをオーバーライドするしかありません。
具体的には、ApplicationEvents.vbファイルのMyApplicationクラス内に、次のような記述をします。
Protected Overrides Function OnInitialize( _ ByVal commandLineArgs As _ System.Collections.ObjectModel.ReadOnlyCollection(Of String) _ ) As Boolean 'スプラッシュウィンドウを表示する最短時間を10秒にする Me.MinimumSplashScreenDisplayTime = 10000 Return MyBase.OnInitialize(commandLineArgs) End Function
例えば、スプラッシュウィンドウにラベルコントロールを配置して、そのTextプロパティを変更することにより、現在の進行状況を表示することができます。ただし、スプラッシュウィンドウはメインスレッドとは別のスレッドで実行されますので、直接スプラッシュウィンドウのコントロールにアクセスすることはできず、Invokeメソッドを使わなければなりません。
この問題に関する詳しい説明はこちらをご覧いただくこととして、ここでは具体例のみを示します。
まずはスプラッシュウィンドウのフォームクラスに以下のようなコードを記述します。スプラッシュウィンドウには、"Message"という名前のラベルコントロールが配置されており、そこにメッセージを表示するものとします。
''' <summary> ''' スプラッシュスクリーンに表示するメッセージを変更する ''' </summary> ''' <param name="msg">表示するメッセージ</param> ''' <remarks></remarks> Friend Sub SetMessage(ByVal msg As String) If Not Me.IsDisposed AndAlso Me.IsHandleCreated Then If Me.InvokeRequired Then Me.Invoke(New EventHandler(AddressOf Me.SetMessagePrivate), _ New Object() {msg, Nothing}) Else Me.SetMessagePrivate(msg, Nothing) End If End If End Sub Private Sub SetMessagePrivate(ByVal sender As Object, _ ByVal e As System.EventArgs) Me.Message.Text = CStr(sender) End Sub
このSetMessageメソッドを呼び出すことにより、スプラッシュウィンドウに現在の状況を表示します。例えば、メインフォームのLoadイベントハンドラでスプラッシュウィンドウに表示する進行状況を変更するには、次のようにします。
'フォームのLoadイベントハンドラ Private Sub Form1_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load Dim ssform As SplashScreen1 = _ CType(My.Application.SplashScreen, SplashScreen1) For i As Integer = 0 To 100 Step 10 ssform.SetMessage(i.ToString() + "% 読み込みました。") System.Threading.Thread.Sleep(1000) Next End Sub