Windows Formsアプリでスプラッシュスクリーンを表示する方法(#2)

2017 年 2 月 13 日 by Dr.K

前回の記事では、スプラッシュスクリーンを作成し、画面に表示するための最低限必要な手順について紹介しました。

今回はこのスプラッシュスクリーンに対し、進捗状況などを表示する処理を追加してみます。
(画像の赤枠で囲んだ箇所(Versionラベル)に表示をおこないます)

素材1

前回の記事の最後に少し触れましたが、スプラッシュスクリーンの表示は別のスレッドで処理されています。
そのため、メインフォーム側(Form1)のスレッドからは、直接スプラッシュスクリーンのコントロール(今回はSplashScreen1.Versionのラベル)にアクセスすることができません。

今回は、以下のような流れで進捗表示をおこなう処理を実装していきます。

  • Form1からSplashScreen1の処理を呼び出す。
  • SplashScreen1で、Form1のスレッドからの呼び出しに対し、SplashScreen1側のスレッド処理を呼び出す
  • SplashScreen1側で、進捗表示をおこなう。
  • まずはSplashScreen1側に以下のコードを記述します。

        Delegate Sub SetStatusDelegate(ByVal msg As String)
    
    Public Sub SetStatus(ByVal msg As String)
        If InvokeRequired Then  ' 別スレッドから呼び出された場合
            Invoke(New SetStatusDelegate(AddressOf SetStatus), msg)
        Else                    ' 同一スレッドから呼び出された場合
            Version.Text = msg
        End If
    End Sub
    

    簡単に説明しておくと、SetStatusが呼び出された際、SplashScreen1を表示しているスレッドと同じスレッドなのか、違うスレッドなのかを判定し、処理を分岐しています。
    (判定はInvokeRequiredでおこなっています。)
    同じスレッドであればそのままVersionラベルを更新しますが、違うスレッドであればSplashScreen1のスレッドに処理を転送してあげます。
    (Invokeメソッドにて、スレッド間の転送をおこなっています。)

    あとはForm1からこの処理を呼び出してあげれば、完成になります。

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        For intStatus As Integer = 0 To 100 Step 10
            SplashScreen1.SetStatus(String.Format("{0}%処理済", intStatus))
            System.Threading.Thread.Sleep(1000)
        Next intStatus
    End Sub
    

    素材2

    今回はスプラッシュスクリーンの進捗表示の処理を実装してみました。
    あまり内容として触れませんでしたが、今回の処理の中ではスレッド処理や、VB.NETではあまり意識しないDelegateの処理などが含まれています。
    個人的には「なんとなく」しか理解できていないジャンルではありますが、これらの内容についても今後踏み込んでいければと思っています。

    タグ:

    TrackBack