そういえば、皆さんにいろいろなご意見をいただきながら修正した
スプラッシュ
スクリーンを結局どうしたのかについて、続きを書いていませんでした。
結局 BackgroundWorker を使って、以下のようにしました。
スプラッシュスクリーンフォームに、BackgroundWorker コントロールを追加し、以下のメソッドを参照して、適切なイベントを登録してあります。
public partial class SplashForm : Form
{
MainWindow mainWindow; // メインウィンドウです。
// スプラッシュスクリーンが開ききったら BackGroundWorker を実行。
private void SplashForm_Shown(object sender, EventArgs e) {
this.backgroundWorker.RunWorkerAsync();
}
// BackGroundWorker による別スレッドの実行内容。
private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e) {
this.mainWindow = new MainWindow();
this.mainWindow.FormClosed += new FormClosedEventHandler(mainWindow_FormClosed);
}
// 別スレッドによる重たい処理が終わった後の処理
private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
this.mainWindow.Show();
this.Hide();
}
// メインウィンドウが閉じられたら、スプラッシュスクリーンも閉じる。
private void mainWindow_FormClosed(object sender, FormClosedEventArgs e) {
this.mainWindow.Dispose();
this.Close();
}
}
Shown にした理由としては、とにかくスプラッシュスクリーンの表示を最優先にしたかったからです。
スプラッシュスクリーンが開いた後は、別スレッドで重たい(筈の)メインウィンドウを生成します。
アプリケーションを実行するためには、以下のようにスプラッシュウィンドウを開きます。
public static class Program
static void Main() {
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new SplashForm());
}
}
本当は、ここでメインフォームを開くのが僕としては理想的ではあるのですが、まあスプラッシュスクリーンがアプリケーションのスターターだと思うことで無理やり納得します orz