R.Tanaka.Ichiro's Blog

主にC# な話題です

目次

Blog 利用状況

ニュース

スプラッシュウィンドウ

起動に時間のかかるソフトウェアの場合、ユーザーに起動していることを知らせる為に表示する比較的小さなサイズのウィンドウをスプラッシュウィンドウと呼びます。

このウィンドウを表示することで、ユーザーはソフトウェアが起動中であることを知ることができます(体感速度もあがります)

スプラッシュウィンドウは、ソフトウェアのメインウィンドウが表示されるタイミングで閉じます(中には、表示されたままというものもあります)

さて、これを実現するために、僕は今まで Program Class の Main()メソッドでスプラッシュウィンドウを開いていました。
しかし、Application.Run(); でメインフォームを開くまでは不用意なことはできません。
何故なら、Application.Run() によってメッセージポンプが起動されるため、この前に何らかの処理を行おうとすると、メッセージポンプが正常に働かない危険性があるらしいのです。
(この辺りは、僕も詳しくないので、詳細は MSDN 等でご自身で確認して下さい)

そんな訳なので、僕は必ず Run で呼び出される MainForm の中で何とか対処するように心がけようと思った訳です。

前置きが長くなりましたが、

とっても単純

なスプラッシュウィンドウです。


public partial class MainWindow : Form
{
  private SplashForm splashForm;

  public MainWindow() {
    this.splashForm = new SplashForm();
    this.splashForm.Show();
    this.InitializeComponent();
    this.Shown += new System.EventHandler(this.MainWindow_Shown);
  }

  private void MainWindow_Shown(object sender, EventArgs e) {
    this.splashForm.Close();
    this.splashForm.Dispose();
  }
}


要するに、コンストラクタの先頭で、何より先にスプラッシュウィンドウを開くことと、Shown イベントを登録して、Shown イベントがスプラッシュウィンドウを閉じると言う訳です。

Shown イベントは、このインスタンスのフォームが表示された直後に一度だけ呼び出されるので、スプラッシュウィンドウが閉じるのはメインウィンドウが表示された後になります。

ちなみに、「this.Shown += new System.EventHandler(this.MainWindow_Shown);」の部分は、デザイナからイベントを登録した場合、this.InitializeComponent(); の中で登録されるので不要です。(というか、こちらの方が良いです)

投稿日時 : 2007年1月10日 11:10

Feedback

# re: スプラッシュウィンドウ 2007/01/10 12:04 じゃんぬねっと

んー微妙ー。

# re: スプラッシュウィンドウ 2007/01/10 14:59 シャノン

Shownで閉じるのはいいと思いますが、俺だったら開くタイミングは変えますね。
スプラッシュスクリーンの管理責任を持つのはメインウィンドウではなくアプリケーションだと考えますから。
ちょっと前にepiさんのblogにも書きましたが、俺は Application.Run( form ); が嫌いなので、ApplicationContextクラスを使います。
これなら、Runとメインフォームを切り離すことができます。
閉じるのも、メインフォームから直接閉じるんじゃなくて、ShownイベントをApplicationContextでハンドルしてやるかな。

# re: スプラッシュウィンドウ 2007/01/10 15:20 シャノン

ちょっと前言撤回させて。
微妙になってきた。

# re: スプラッシュウィンドウ 2007/01/10 19:46 Jitta

同じく、微妙。Rさんとこ、Opera で見ると全部下線が引かれるのよね。。。ちげ
(C# 1.1)
static void Main()
{
Application.Run(new Form1());
}
なので、Form1 のコンストラクタが終了するまで、メッセージポンプは起動していない。と、理解します。
スプラッシュウインドウがメッセージポンプを起動し、メインウインドウの構築が終わったら自身は Hide する。かな。

# re: スプラッシュウィンドウ 2007/01/11 0:18 inoGUCCI

ちょっと暇だったので会社でやってみたのですが、
シャノンさんと一緒で僕は ApplicationContext 継承させたクラスを
Application.Run に指定してみました。

最初は MainFormプロパティ にスプラッシュウィンドウを指定して、
アプリケーションのフォームが表示されたら MainForm プロパティを
切り替えてみました。

※MSDNにはMainFormはいつでも変更できますとあったので
 このやり方ですが・・・・・・いけてないんでしょうか?

# re: スプラッシュウィンドウ 2007/01/11 0:18 inoGUCCI

ところで シャノン さんの撤回理由が知りたいです!!!!

# re: スプラッシュウィンドウ 2007/01/11 1:31 おぎわら

つ【WindowsFormsApplicationBase.OnCreateSplashScreen()】

# re: スプラッシュウィンドウ 2007/01/11 2:00 inoGUCCI

VB にそんなクラスがあったなんて知りませんでした。
なんか VB 恐るべしですね・・・

てか VB っていう文字を久し振りに書いた気がします。
僕はこの業界 VB(VB5) から入ったんですがね~

# スプラッシュスクリーンに物申す 2007/01/11 9:55 .COM -どっとこむ-

スプラッシュスクリーンに物申す

# re: スプラッシュウィンドウ 2007/01/11 9:58 シャノン

> ところで シャノン さんの撤回理由が知りたいです!!!!
↑で書いてみた。

# re: スプラッシュウィンドウ 2007/01/11 18:14 R・田中一郎

2007/01/11 18:00 by R・田中一郎
じゃんぬねっと さん

>んー微妙ー。

微妙の意味がとけません orz

---------------------------------------------------
シャノン さん

>ちょっと前にepiさんのblogにも書きましたが、俺は Application.Run( form ); が嫌いな

同感です~

>閉じるのも、メインフォームから直接閉じるんじゃなくて、ShownイベントをApplicationContextでハンドルしてやるかな。

なるほど、試してみます。

---------------------------------------------------
Jitta さん

>同じく、微妙。Rさんとこ、Opera で見ると全部下線が引かれるのよね。。。ちげ

えっ、そうなんですか?^^;
今度 Opera で見てみます。

>なので、Form1 のコンストラクタが終了するまで、メッセージポンプは起動していない。と、理解します。

なるほど、splash ウィンドウをサクッと起動させてから、時間のかかる処理を行えば良いのですね。

---------------------------------------------------
inoGUCCI さん

>最初は MainFormプロパティ にスプラッシュウィンドウを指定して、
アプリケーションのフォームが表示されたら MainForm プロパティを
切り替えてみました。

面白いやり方ですね。参考にさせていただきます。

---------------------------------------------------
おぎわら さん

>つ【WindowsFormsApplicationBase.OnCreateSplashScreen()】

読みました。VBって偉いなぁ。

# re: スプラッシュウィンドウ 2007/02/01 13:09 なちゃ

>メッセージポンプが正常に働かない危険性があるらしい

これの情報ソースを教えてほしいんですが…
いや、どこで見かけたとかでもいいんですが…

# re: スプラッシュウィンドウ 2007/02/01 13:28 R・田中一郎

なちゃ さん

>これの情報ソースを教えてほしいんですが…
>いや、どこで見かけたとかでもいいんですが…

僕がこの事実を知ったのは、以下のリンクの辺りでした。

http://blogs.wankuma.com/rti/archive/2006/12/25/53572.aspx

# re: スプラッシュウィンドウ 2007/02/02 0:40 なちゃ

んー、これ、リンク先のどぼんさんのとこ呼んでみたんですけど、
メッセージポンプが正常に働かないというより、
元々無茶なことをしたときに、どう動くかって話ですよね?
※まあ2つ目はちょっと微妙ですが(タイミングの問題?)

一つ目なんかはそりゃそうなうだろうなという感じでもあります。
で、気になるのは、普通にShowDialogが正常に動作しない
(ShowDialogで動き出したメッセージポンプが想定どおりに動作しない)
ってことがあるのかな?、というところなんですが…

てここでぶつぶつ言ってもしゃーないですね、失礼しました。

# re: スプラッシュウィンドウ 2007/02/04 9:08 R・田中一郎

なちゃさん


http://dobon.net/vb/dotnet/form/notopenform.html より引用
-------------
以上の説明によると、「Application.Run(new Form1())」というのはどうやら、「Form1を表示させ、Form1が閉じられるまでメッセージループをまわす」ということを意味しており、ウィンドウズアプリケーションには不可欠なものらしいということが分かります。

それではApplication.Runを使わずにForm.ShowDialogでメインフォームを表示した時は、メッセージループが回らないというのでしょうか?もちろんそうではありません。実はForm.ShowDialogでメインフォームを表示させた時も、必要があると判断されれば、Application.Runと同様の処理が行われます。つまり、どちらでもあまり変わらないということです。
-----------
とあります。

結局は、どのような場合に OK で、どのような場合が NG なのかという明確な線引きが、今ひとつっわからないんですよね。
なので、単に「Application.Run しておけば問題なさそう」という納得(妥協)している訳なのです。

# スプラッシュウインドウ 2007/04/15 13:58 オノデラの研究日記 in わんくま

スプラッシュウインドウ

タイトル
名前
Url
コメント