DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

VB.NETでスプラッシュウィンドウを表示する

注意:ここではVisual Studio 2005以降のVB.NETでスプラッシュウィンドウを表示する方法を紹介します。それ以外の場合は、「スプラッシュウィンドウを表示する」をご覧ください。

Visual Studio 2005以降のVB.NETであれば、Visual Basicアプリケーションモデルを使って、簡単にスプラッシュウィンドウを表示することができます。

以下にその手順を示します。

  1. スプラッシュウィンドウとして表示するフォームを作成します。「新しい項目の追加」から「スプラッシュスクリーン」を選択して作成したフォームを使うと便利でしょう。
  2. メニューの「プロジェクト」-「プロパティ」により、プロジェクトのプロパティを表示します。
  3. 「アプリケーション」タブを選択します(デフォルトで選択されています)。
  4. 「アプリケーションフレームワークを有効にする」にチェックを入れ、有効にします。
  5. 「Windowsアプリケーションフレームワークプロパティ」の「スプラッシュスクリーン」で先ほど作成したスプラッシュウィンドウ用のフォームを選択します。
  6. 以上です。

コマンドライン引数に"/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クラス内に、次のような記述をします。

VB.NET
コードを隠すコードを選択
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"という名前のラベルコントロールが配置されており、そこにメッセージを表示するものとします。

VB.NET
コードを隠すコードを選択
''' <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イベントハンドラでスプラッシュウィンドウに表示する進行状況を変更するには、次のようにします。

VB.NET
コードを隠すコードを選択
'フォームの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

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • イベントハンドラの意味が分からない、C#のコードをそのまま書いても動かないという方は、こちらをご覧ください。
  • .NET Tipsをご利用いただく際は、注意事項をお守りください。